获取对应名称的每日最大值

Get max value per day with the corresponding name

我有以下 table:

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 还希望我按名称分组,这再次导致上面的 table(以不同的行顺序)。

使用distinct on:

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

您也可以使用 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

你试试下面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
;