gpt4 book ai didi

sql - 根据 PostgreSQL 中的条件选择组内的一行

转载 作者:行者123 更新时间:2023-11-29 14:27:24 26 4
gpt4 key购买 nike

我有一个这样的表(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 的行对于每个组。

我可以轻松选择 grpval :

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)构成一个关键,我可以左加入tbl2tbl同样 grpval .

但是,我想知道是否还有其他解决方案:在我的真实情况下 tbl是一个非常复杂和繁重的派生表,我有不能使用临时表的设计限制。有什么办法可以根据 val 对每个组内的行进行排序吗?然后为每个组取第一个记录?

我使用的是 PostgreSQL 10,但标准的 SQL 解决方案是最好的。

最佳答案

在 Postgres 中,最好的方法是 distinct on:

SELECT DISTINCT ON (t.grp) t.*
FROM tbl
ORDER BY grp, val DESC;

特别是,这可以利用 (grp, val desc) 上的索引。

关于sql - 根据 PostgreSQL 中的条件选择组内的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56395196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com