首页 > 解决方案 > 有没有办法根据 Max(date) 在 postgres 中获取组的第一行

问题描述

输入 :

id      name        value1      value2        date

1        A              1           1       2019-01-01
1        A              2           2       2019-02-15
1        A              3           3       2019-01-15
1        A              1           1       2019-07-13

2        B              1           2       2019-01-01
2        B              1           3       2019-02-15
2        B              2           1       2019-07-13

3        C              2           4       2019-02-15
3        C              1           2       2019-01-01
3        C              1           9       2019-07-13
3        C              3           1       2019-02-15

预期输出:

id      name        value1      value2        date

1        A              1    Avg(value2)    2019-07-13
2        B              2    Avg(value2)    2019-07-13
3        C              1    Avg(value2)    2019-07-13

标签: sqlpostgresqlgreatest-n-per-group

解决方案


您可以使用窗口函数。rank() over()可用于识别每组中的第一条记录,并avg() over()为您提供value2每组中的窗口平均值:

select id, name, value1, avg_value2 value2, date
from (
    select 
        t.*,
        avg(value2) over(partition by id, name) avg_value2,
        rank() over(partition by id, name order by date desc) rn
    from mytable t
) t
where rn = 1

推荐阅读