postgresql - GROUP BY 时前两个值的差异

标签 postgresql group-by

假设我有以下 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/

相关文章:

python - PostgreSQL 表上的更新查询不起作用

mysql - 如何统计 MySQL 中所有满足条件的不同值?

mysql - 使用 GROUP BY 查询会变慢

python - Pandas - 根据条件复制行

node.js - 如何从 Nest.js 连接到 Heroku Postgres?

PostgreSQL:权限被拒绝+拥有错误的所有权循环?

c# - EntityFrameworkCore PostgreSQL Left Join 不工作的地方

postgresql - 从 PostgreSQL 中的 TRIGGER 返回错误消息

mysql - 在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

mysql - GROUP BY 时间戳每 15 分钟一次,包括丢失的条目