1

我有一个表(实际上这是一个很大的查询,所以请不要在表上使用连接),如下所示:

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

每当我尝试按子句创建分组时,该查询无法检索数据列,也不支持数据列上的不同值。

4

1 回答 1

2

您可以row_number为此使用窗口函数:

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

返回:

+--------+--------+----+----------+
|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
)
于 2020-08-19T10:38:25.280 回答