【问题标题】:Get max value per day with the corresponding name每天获取对应名称的最大值
【发布时间】:2021-04-17 19:00:09
【问题描述】:

我有下表:

day name val
12-01-2021 Een 1
11-01-2021 Twee 12
12-01-2021 Drie 0
12-01-2021 Twee 1
11-01-2021 Drie 19
11-01-2021 Een 11

现在我想获取每天最大的val,包括对应的val 的名称。我怎样才能得到这个?我得到了以下查询:

select max(val), day 
from table t 
group by day;

但是,我希望结果包含相应的名称。我的第一个想法是在查询中包含name

select name, max(val), day 
from table t 
group by day;

问题是 Postgres 希望我也按名称分组,这再次导致上表(以不同的行顺序)。

【问题讨论】:

    标签: sql postgresql greatest-n-per-group


    【解决方案1】:

    使用distinct on:

    select distinct on (day) t.*
    from t
    order by day, val desc;
    

    【讨论】:

      【解决方案2】:

      您还可以使用 WINDOW 函数来避免 DISTINCT ON 并同时处理其他品牌的数据库。 row_number() 和 ORDER BY 可以解决问题:

      WITH i AS (
          SELECT  
              name
              , val
              , day
              , row_number() OVER(PARTITION BY name ORDER BY val DESC, day)
          FROM    table t
      )
      SELECT  name
          ,   val
          ,   day
      FROM    i
      WHERE   row_number = 1; -- one result for every name, the first one
      

      【讨论】:

        【解决方案3】:

        你试试下面的sql。

        WITH max_val AS (
            SELECT MAX(val) AS max_val
                   ,day 
            FROM TABLE t
            GROUP BY day
        )
        
        SELECT  max_val.max_val
                ,t.name
                ,t.day
        FROM TABLE t
        INNER JOIN max_val
        ON t.day = max_val.day
        ;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-10
          • 1970-01-01
          • 1970-01-01
          • 2021-11-04
          • 2020-08-22
          • 2019-02-08
          • 2020-04-30
          相关资源
          最近更新 更多