【发布时间】:2019-05-31 12:31:31
【问题描述】:
我有一张这样的桌子 (tbl):
+----+-----+------+-----+
| pk | grp | attr | val |
+----+-----+------+-----+
| 0 | 0 | ohif | 4 |
| 1 | 0 | foha | 56 |
| 2 | 0 | slns | 2 |
| 3 | 1 | faso | 11 |
| 4 | 1 | tepj | 4 |
| 5 | 2 | bnda | 12 |
| 6 | 2 | ojdf | 9 |
| 7 | 2 | anaw | 1 |
+----+-----+------+-----+
我想从每个组中选择一行,特别是每个组的最大 val。
我可以轻松选择grp 和val:
SELECT grp, MAX(val)
FROM tbl
GROUP BY grp
让出这张桌子(tbl2):
+-----+-----+
| grp | val |
+-----+-----+
| 0 | 56 |
| 1 | 11 |
| 2 | 12 |
+-----+-----+
但是,我想要这张桌子:
+----+-----+------+-----+
| pk | grp | attr | val |
+----+-----+------+-----+
| 1 | 0 | foha | 56 |
| 3 | 1 | faso | 11 |
| 5 | 2 | bnda | 12 |
+----+-----+------+-----+
由于(grp, val) 构成密钥,我可以将tbl2 与tbl 左连接到同一grp 和val。
但是,我想知道是否有任何其他解决方案:在我的实际情况下,tbl 是一个非常复杂且繁重的派生表,并且我有无法使用临时表的设计约束。有什么办法可以按照val对每组内的行进行排序,然后为每组取第一条记录?
我使用的是 PostgreSQL 10,但标准 SQL 解决方案是最好的。
【问题讨论】:
标签: sql postgresql group-by