У меня есть таблица как таковая (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
для каждой группы.
Т.е., я хочу эту таблицу:
+----+-----+------+-----+
| pk | grp | attr | val |
+----+-----+------+-----+
| 1 | 0 | ohif | 4 |
| 3 | 1 | tepj | 4 |
| 5 | 2 | ojdf | 9 |
+----+-----+------+-----+
Вот решение, которое я придумал:
SELECT DISTINCT ON (grp)
pk,
(
SELECT innertbl.grp
FROM tbl AS innertbl
WHERE innertbl.grp = tbl.grp
ORDER BY innertbl.val DESC
LIMIT 1 OFFSET 1
) AS grp,
(
SELECT innertbl.attr
FROM tbl AS innertbl
WHERE innertbl.grp = tbl.grp
ORDER BY innertbl.val DESC
LIMIT 1 OFFSET 1
) AS attr,
(
SELECT innertbl.val
FROM tbl AS innertbl
WHERE innertbl.grp = tbl.grp
ORDER BY innertbl.val DESC
LIMIT 1 OFFSET 1
) AS val
FROM tbl
Однако это неэффективно, так как для каждого столбца требуется подзапрос для каждого столбца.
Я на Postgres 10.