我试图在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;
答案 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,但我不明白为什么这不会做你需要的。)