获取对应名称的每日最大值
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
;
我有以下 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
;