SQL Server TOP(1) 具有不同的

Posted

技术标签:

【中文标题】SQL Server TOP(1) 具有不同的【英文标题】:SQL Server TOP(1) with distinct 【发布时间】: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? 如果您已经按您选择的同一列进行分组,则不需要区分。 请显示样本数据和所需结果。我试图弄清楚在有和没有不同的情况下你将如何获得不同的结果,我认为你需要提供更多信息。 【参考方案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

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

【讨论】:

以上是关于SQL Server TOP(1) 具有不同的的主要内容,如果未能解决你的问题,请参考以下文章

具有不同 SQL Server 版本的 SQL Server 主文件名

具有不同字符的 SQL Server 组连接

Sql Server如何在具有不同后缀的不同表中查找值

SQL Server中TOP子句可能导致的问题以及解决办法

SQL Server:具有不同长度的分析窗口函数

具有不同排序方向的多列上的Sql server聚集索引