假设我有以下 SQL 表:
id | score
------------
1 | 4433
1 | 678
1 | 1230
1 | 414
5 | 8899
5 | 123
6 | 2345
6 | 567
6 | 2323
现在我想做一个GROUP BY id
操作其中score
列将修改如下:取每个 id
的前两个最高分之间的绝对差值.
例如,上述查询的响应应该是:
id | score
------------
1 | 3203
5 | 8776
6 | 22
如何在 PostgreSQL 中执行此查询?
最佳答案
使用 ROW_NUMBER
以及旋转逻辑,我们可以尝试:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY score DESC) rn
FROM yourTable
)
SELECT id,
ABS(MAX(score) FILTER (WHERE rn = 1) -
MAX(score) FILTER (WHERE rn = 2)) AS score
FROM cte
GROUP BY id;
Demo
关于postgresql - GROUP BY 时前两个值的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70844735/