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) 具有不同的的主要内容,如果未能解决你的问题,请参考以下文章