获取GROUP BY中的第一个值而不是聚合值

时间:2017-05-03 10:22:43

标签: sql-server

我正在使用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)

如何获取第一个值而不是聚合值?

1 个答案:

答案 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