sql - 除了group by之外,如何选择*?

标签 sql postgresql

考虑一个包含 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/

相关文章:

SQL:如何从一个表中选择另一个表中的不同值?

c# - 可以从存储过程中编写 DAL 参数集合吗?

sql - sql中的三种方式连接

MYSQL:选择的意外结果

ruby-on-rails - psql 错误 : relation already exists

mysql - PostgreSQL 的 EXPLAIN ANALYZE 的 MySQL 等价物是什么

c# - 选择表的列名和类型

sql - 单个查询中多个日期范围的总和?

mysql - 如何设置评级表SQL

SQL - 具有多个 <> 的失败条件