每天获取对应名称的最大值
Posted
技术标签:
【中文标题】每天获取对应名称的最大值【英文标题】: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 希望我也按名称分组,这再次导致上表(以不同的行顺序)。
【问题讨论】:
【参考方案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
;
【讨论】:
以上是关于每天获取对应名称的最大值的主要内容,如果未能解决你的问题,请参考以下文章