【发布时间】:2015-07-02 15:56:40
【问题描述】:
我在结果集的分区内的 sql 中使用 ROW_NUMBER 函数,我只想要每个分区中的第一行。这是查询:
Select A, B, C, ROW_NUM
FROM
(SELECT A,B,C, ROW_NUMBER() OVER (PARTITION BY A ORDER BY C DESC) AS R0W_NUM
FROM TABLE
)X
WHERE ROW_NUM = 1
它产生了预期的结果。
但不是这个,现在我使用 FIRST_VALUE 函数如下:
SELECT A,B,C, FIRST_VALUE(C) OVER (PARTITION BY A ORDER BY C DESC) AS ROW_NUM
FROM TABLE
但是上面的查询也给了我重复的值。谁能指导我如何摆脱重复项?我尝试使用 DISTINCT,没有帮助。
【问题讨论】:
-
您可以用
FIRST_VALUE(<letter>)替换所有A,B,C并重复OVER()子句以获得相同的结果集,但您为什么要这样做?如果ROW_NUMBER()已经在做正确的工作,这里的实际动机是什么?或者,如果它没有做正确的工作,那么您实际上想在这里实现什么? -
请务必使用正确的方言标记 SQL 问题(
tsql,我相信?)以便精通该方言的人可以提供帮助(因为 SQL 方言之间存在显着差异)。 -
用
SELECT DISTINCT怎么样? -
@Amadan:是什么让你认为那是 T-SQL?示例显示实际上是标准的 ANSI SQL。但我同意这个问题应该用相关的 DBMS 标记
-
@a_horse_with_no_name:我承认这是瞎猜。
标签: sql sql-server-2014 window-functions