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

标签 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)

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

最佳答案

您可以在 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

关于sql-server - 获取 GROUP BY 中的第一个值而不是聚合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43757374/

相关文章:

mysql - SQL - 多对多表不起作用

c# - EWS 托管 API 和 SQL Server - 登录失败。登录来自不受信任的域,不能与 Windows 身份验证一起使用

python - AppVeyor 上 Python 和 SQL Server 的多种组合

mysql - 如何找到复杂的SQL查询

java - 检查表是否存在,使用java中的连接对象

python - MS SQL 数据库到 SAS

sql server 2000比较明细总和与总金额

sql - 如何获取对sql server中特定sp具有执行权限的用户?

HTML 表单到 SQL 数据库

sql-server - SQL Azure - 确定哪些表是联合的