我正在使用GROUP BY和聚合函数来聚合一个表(按多个外键分组,一个值列和一个向下舍入到整天的时间戳列。)
但是有一列我需要在分组中获取第一行,而不是聚合值。我查看了FIRST_VALUE(),但它是一个窗口函数,而不是聚合函数。
在伪代码中我希望这样做[FIRST()函数不存在]:
SELECT
ForeignKey1
,ForeignKey2
,MIN(StartTime) AS StartTime
,Foo
,AVG(Bar) AS Bar
,FIRST(Baz) AS Baz
FROM
Qux
GROUP BY
ForeignKey1
,ForeignKey2
,Foo
,CONVERT(DATE, StartTime)
如何获取第一个值而不是聚合值?
答案 0 :(得分:1)
您可以在CTE中应用行号,然后拉出整个第一行,不需要单独的MIN
聚合:
;With Ordered as (
SELECT
*,
ROW_NUMBER() OVER(
PARTITION BY
ForeignKey1
,ForeignKey2
,Foo
,CONVERT(DATE, StartTime)
ORDER BY StartTime) as rn,
AVG(Bar) OVER (
PARTITION BY
ForeignKey1
,ForeignKey2
,Foo
,CONVERT(DATE, StartTime)) as BarAvg
FROM Qux
)
SELECT * from Ordered
WHERE rn = 1