【问题标题】:SQL Server TOP(1) with distinctSQL Server TOP(1) 具有不同的
【发布时间】:2013-12-03 20:57:27
【问题描述】:

我正在尝试提取按i_version_id 排序结果后得到的第一行。如果我不使用TOP(2),我的查询将按预期工作,并返回按 i_version_id 排序的所有结果。但是当我添加TOP(2)(如下图)时,却说distinct附近有语法错误。请让我知道我做错了什么。

SELECT TOP(2) 
    distinct(i_version_id) 
FROM 
    [PaymentGateway_2006].[dbo].[merchant] 
WHERE 
    dt_updated_datetime > '2013-11-11'
GROUP BY
    i_version_id 
ORDER BY 
    i_version_id;

【问题讨论】:

  • 什么版本的 SQL Server?
  • 如果您已经按您选择的同一列进行分组,则不需要区分。
  • 请显示样本数据和所需结果。我试图弄清楚在有和没有不同的情况下你将如何获得不同的结果,我认为你需要提供更多信息。

标签: sql sql-server database dml


【解决方案1】:

如果您只得到TOP 1,那么distinct 是无关紧要的。这也无关紧要,因为按列分组会给你不同的值,

但是,如果您想要多个,只需删除括号:

SELECT DISTINCT TOP(2) 
    i_version_id
FROM 
    [PaymentGateway_2006].[dbo].[merchant] 
WHERE 
    dt_updated_datetime > '2013-11-11'
GROUP BY
    i_version_id 
ORDER BY 
    i_version_id;

【讨论】:

  • 是的,但假设我需要 2 个不同的顶级结果。
  • 能否提供一些示例数据
【解决方案2】:

这行得通吗?

SELECT
*
FROM
(
SELECT i_version_id,
    ROW_NUMBER() OVER (PARTITION BY i_version_id ASC) [counter]
FROM 
    [PaymentGateway_2006].[dbo].[merchant] 
WHERE 
    dt_updated_datetime > '2013-11-11'
GROUP BY
    i_version_id 
ORDER BY 
    i_version_id
) a
WHERE [counter] <= 2

这将为每条记录提供一个行计数器。在上面的示例中使用 GROUP BY 和 DISTINCT 毫无意义,因为您的 GROUP BY 已经限制了您的记录。加入 DISTINCT 只会影响性能。

至于您的错误,您不能同时使用 TOP 和 DISTINCT AFAIK。如果你也想试试这个:

SELECT
TOP 2 i_version_id
FROM
(
SELECT i_version_id 
FROM 
    [PaymentGateway_2006].[dbo].[merchant] 
WHERE 
    dt_updated_datetime > '2013-11-11'
GROUP BY
    i_version_id 
ORDER BY 
    i_version_id
) a

(我没有测试过这个,因为我没有你的数据库,但我不明白为什么这不能满足你的需要)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多