Postgres 在 groupby 和 max 之后选择 *

Posted

技术标签:

【中文标题】Postgres 在 groupby 和 max 之后选择 *【英文标题】:Postgres select * after groupby and max 【发布时间】:2020-12-19 18:03:07 【问题描述】:

考虑一个具有 id PK 和 26 列的表。 (a,b)上有索引

id | a | b | c | d | e ... | z |
--------------------------------

我正在尝试选择 (a,b) 的唯一配对最近的行。 IE 每个(a,b) 的最后一条记录是什么因为ID 是自动递增的,所以知道最大值是最后一行。

SELECT MAX(id), a, b
FROM table GROUP BY (a, b)

但是,有没有办法让SELECT 显示所有列而不手动列出它们,例如。

SELECT MAX(ID), a, b, c ... z

我尝试了以下方法无济于事

SELECT MAX(ID), *
SELECT MAX(ID), table.*

【问题讨论】:

对这类情况使用“distinct”。 【参考方案1】:

在 Postgres 中,distinct on 很方便:

select distinct on (a, b) t.*
from mytable t
order by a, b, id desc

【讨论】:

啊,谢谢伙计。我最初尝试过这个但做了order by a,b 而不是order by a, b, id desc。谢谢 - id 参考解决了它!只是好奇,如果id desc 我使用b desc,为什么会失败?比如你怎么知道id 是必须下降的字段?我真的很想显示按a, b 而不是a, b, id 排序的表格,因为这有点乱。我想我可以用 CTW 进行二次排序 @AdamHughes:这为每个(a, b) 元组提供一行,结果按(a, b) 排序。 order by 子句必须以与distinct on 子句中相同的列开头,后跟一列(或一组列)以标识应为每个组保留的记录。你想要最新的记录id,所以id desc

以上是关于Postgres 在 groupby 和 max 之后选择 *的主要内容,如果未能解决你的问题,请参考以下文章

如何优化 Postgresql max_connections 和 node-postgres 连接池?

从 postgres 中的子网/掩码获取 MAX 和 MIN ip

Scala - 对 RDD 上的 Groupby 和 Max

Postgres:增加 bdr.max_databases 变量失败

Apache Spark SQL数据集groupBy具有max函数和另一列中的不同值

Postgres 每小时按数据分组,然后找到 max 和 min createdAt 的时间差并计算它们的总和