考虑一个包含 a-z 字段的 PostgreSQL 表
a, b, c ... z
-------------
5, 6, 2 ... 9
5, 6, 3 ... 1
我想对字段 a,b
进行分组,并仅保留 b 最大的记录。
SELECT a, max(b) as b, c, d, e ... z
FROM table
GROUP BY a, b
这工作得很好,但是必须在 SELECT 中输入所有值很烦人。我宁愿做类似的事情
SELECT max(b) as b, *
FROM TABLE
但是这样做会出错
[42803] ERROR: column "table.id" must appear in the GROUP BY clause or be used in an aggregate function.
知道如何避免在执行 groupby 操作时在冗长的表中键入所有列名吗?
最佳答案
您可以使用rank()
:
select t.*
from (select t.*, rank() over (partition by a order by b desc) as seqnum
from t
) t
where seqnum = 1;
实际上,在 Postgres 中,最快的方法通常是 distinct on
:
select t.*
from t
order by a, b desc;
在 (a, b desc)
上建立索引,这应该是最快的方法。
关于sql - 除了group by之外,如何选择*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63649783/