首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据PostgreSQL中的条件选择组内的一行

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

Stack Overflow用户
提问于 2019-05-31 20:31:32
回答 1查看 24关注 0票数 0

我有一个这样的表(tbl):

代码语言:javascript
复制
+----+-----+------+-----+
| 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

代码语言:javascript
复制
SELECT grp, MAX(val)
FROM tbl
GROUP BY grp

生成此表(tbl2):

代码语言:javascript
复制
+-----+-----+
| grp | val |
+-----+-----+
|   0 |  56 |
|   1 |  11 |
|   2 |  12 |
+-----+-----+

但是,我想要这个表:

代码语言:javascript
复制
+----+-----+------+-----+
| pk | grp | attr | val |
+----+-----+------+-----+
|  1 |   0 | foha |  56 |
|  3 |   1 | faso |  11 |
|  5 |   2 | bnda |  12 |
+----+-----+------+-----+

因为(grp, val)构成了一个键,所以我可以在相同的grpval上使用tbl2tbl进行左连接。

然而,我想知道是否有其他解决方案:在我的实际情况下,tbl是一个相当复杂和繁重的派生表,并且我有不能使用临时表的设计约束。有没有办法根据val对每个组中的行进行排序,然后获取每个组的第一条记录?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-31 20:33:51

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

代码语言:javascript
复制
SELECT DISTINCT ON (t.grp) t.*
FROM tbl
ORDER BY grp, val DESC;

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56395196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档