如何在 Postgres 中检索由另一个分组的最大值的完整记录?
How can I retrieve the complete record with the maximun value grouped by another in Postgres?
我有一个 table(实际上这是一个很大的查询,所以请不要在 table 上使用连接)如下:
date | priority | data
20200301 | 1 | 0.3
20200301 | 2 | 0.4
20200302 | 2 | 0.4
20200302 | 3 | 0.1
20200303 | 1 | 0.8
所以,我想要日期和每个日期优先级最低的数据,所以我要查找的查询结果将是:
date | priority | data
20200301 | 1 | 0.3
20200302 | 2 | 0.4
20200303 | 1 | 0.8
每当我尝试按子句进行分组时,该查询无法检索数据列,也不支持数据列上的不同值。
您可以为此使用 row_number
window 函数:
CREATE TABLE t (
"date" INTEGER,
"priority" INTEGER,
"data" FLOAT
);
INSERT INTO t
("date", "priority", "data")
VALUES ('20200301', '1', '0.3')
, ('20200301', '2', '0.4')
, ('20200302', '2', '0.4')
, ('20200302', '3', '0.1')
, ('20200303', '1', '0.8');
SELECT *
FROM (
SELECT *, row_number() OVER (PARTITION BY date ORDER BY priority)
FROM t
) f
WHERE row_number = 1
returns:
+--------+--------+----+----------+
|date |priority|data|row_number|
+--------+--------+----+----------+
|20200301|1 |0.3 |1 |
|20200302|2 |0.4 |1 |
|20200303|1 |0.8 |1 |
+--------+--------+----+----------+
正如@david 在评论中提到的那样,根据“priority = min_priority_for_date”过滤行可能更有效(而不是对它们进行排名然后过滤):
SELECT *
FROM t
WHERE (date, priority) IN (
SELECT date, MIN(priority)
FROM t
GROUP BY date
)
我有一个 table(实际上这是一个很大的查询,所以请不要在 table 上使用连接)如下:
date | priority | data
20200301 | 1 | 0.3
20200301 | 2 | 0.4
20200302 | 2 | 0.4
20200302 | 3 | 0.1
20200303 | 1 | 0.8
所以,我想要日期和每个日期优先级最低的数据,所以我要查找的查询结果将是:
date | priority | data
20200301 | 1 | 0.3
20200302 | 2 | 0.4
20200303 | 1 | 0.8
每当我尝试按子句进行分组时,该查询无法检索数据列,也不支持数据列上的不同值。
您可以为此使用 row_number
window 函数:
CREATE TABLE t (
"date" INTEGER,
"priority" INTEGER,
"data" FLOAT
);
INSERT INTO t
("date", "priority", "data")
VALUES ('20200301', '1', '0.3')
, ('20200301', '2', '0.4')
, ('20200302', '2', '0.4')
, ('20200302', '3', '0.1')
, ('20200303', '1', '0.8');
SELECT *
FROM (
SELECT *, row_number() OVER (PARTITION BY date ORDER BY priority)
FROM t
) f
WHERE row_number = 1
returns:
+--------+--------+----+----------+
|date |priority|data|row_number|
+--------+--------+----+----------+
|20200301|1 |0.3 |1 |
|20200302|2 |0.4 |1 |
|20200303|1 |0.8 |1 |
+--------+--------+----+----------+
正如@david 在评论中提到的那样,根据“priority = min_priority_for_date”过滤行可能更有效(而不是对它们进行排名然后过滤):
SELECT *
FROM t
WHERE (date, priority) IN (
SELECT date, MIN(priority)
FROM t
GROUP BY date
)