sql - PostgreSQL 按列分组与聚合

标签 sql postgresql

我需要group by id 并选择 task最小/最大 seqstartend

 id | task | seq    
----+------+-----
  1 | aaa  |   1 
  1 | bbb  |   2
  1 | ccc  |   3
SELECT
  id,
  CASE WHEN seq = MIN(seq) THEN task AS start,
  CASE WHEN seq = MAX(seq) THEN task AS end
FROM table
GROUP BY id;

但这会导致

ERROR:  column "seq" must appear in the GROUP BY clause or be used in an aggregate function

但我不想分组 seq

最佳答案

一种方法使用数组:

SELECT id, 
       (ARRAY_AGG(task ORDER BY seq ASC))[1] as start_task,
       (ARRAY_AGG(task ORDER BY seq DESC))[1] as end_task
FROM table
GROUP BY id;

另一种方法使用带有 SELECT DISTINCT 的窗口函数:

select distinct id,
       first_value(task) over (partition by id order by seq) as start_task,
       first_value(task) over (partition by id order by seq desc) as end_task
from t;

关于sql - PostgreSQL 按列分组与聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64576612/

相关文章:

python - Django 中的 manytomany 实现(管理问题)

sql - 为字典表找到正确的术语

mysql - 如何在 mySQL 中使用 exp() 创建/写入文件

nhibernate、postgresql 和 datetime.maxvalue

sql - 这个 WHERE 子句和这个 Join 有什么区别?

postgresql - Postgresql解释分析: hidden time

sql - 检查是否有任何数组元素以特定字符 postgres 开头

sql - 如何紧密包含 SQL 查询结果

使用 left() 函数时 SQL CASE 失败

mysql - 优化 innoDB 中的 MySQL LIKE '%string%' 查询