SQL Server TOP(1)与不同

时间:2013-11-20 02:34:06

标签: sql sql-server database dml

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

2 个答案:

答案 0 :(得分:13)

如果您只获得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;

答案 1 :(得分: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 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

(我没有测试过这个,因为我没有你的Db,但我不明白为什么这不会做你需要的。)