SQL Partition by子句

时间:2015-04-24 07:04:25

标签: sql sql-server-2014 window-functions

我在结果集的分区中的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,没有帮助。

1 个答案:

答案 0 :(得分:0)

在C上使用FIRST_VALUE不会消除A的重复。

如果你想摆脱A的重复,你可以使用以下查询之一,具体取决于B的角色。

如果B被认为是分区的一部分,则类似于A

Select A, B, MAX(C)
FROM TABLE
GROUP BY A, B

如果B包含可以聚合的值(min,max,sum ...),则类似于C

Select A, MAX(B), MAX(C)
FROM TABLE
GROUP BY A

如果B既不与A(可能分区)或C(可能聚合)相似,那么我会保留你在问题中包含的ROW_NUMBER()解决方案。

相关问题