我有一个这样的表(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)构成了一个键,所以我可以在相同的grp和val上使用tbl2和tbl进行左连接。
然而,我想知道是否有其他解决方案:在我的实际情况下,tbl是一个相当复杂和繁重的派生表,并且我有不能使用临时表的设计约束。有没有办法根据val对每个组中的行进行排序,然后获取每个组的第一条记录?
我使用的是SQL10,但标准的PostgreSQL解决方案将是最好的。
发布于 2019-05-31 20:33:51
在Postgres中,最好的方法是distinct on。
SELECT DISTINCT ON (t.grp) t.*
FROM tbl
ORDER BY grp, val DESC;特别是,这可以利用(grp, val desc)上的索引。
https://stackoverflow.com/questions/56395196
复制相似问题