SQL Server中使用TOP(1)和DISTINCT的方法

7
我试图在按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;

1
SQL Server 的哪个版本? - D Stanley
当您已经按选择的相同列进行分组时,不需要使用Distinct。 - Cᴏʀʏ
1
请展示样本数据和期望结果。我试图弄清楚你如何可能在有或没有去重的情况下得到不同的结果,我认为你需要提供更多信息。 - Aaron Bertrand
2个回答

16

如果你只获取 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
是的,但假设我需要两个不同的顶部结果。 - Darth.Vader
你能提供一些样本数据吗? - Juan

0

这个可行吗?

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。如果您想要尝试,可以尝试以下方法:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接