postgresql - 为每个 ID 选择最大值(包括一个 ID 有多个最大值的可能性!)

标签 postgresql max aggregate-functions greatest-n-per-group

我有一张表,假设有一个 ID 和一个分数。我想为每个 ID 获得最高分数。但可能会发生我对一个 ID 有相同分数的情况,在这种情况下我想同时拥有这两个值。假设我有一张 table

ID    score
1     10
1     10
2     8
2     6

我想得到结果

ID    score
1     10
1     10
2     8

这将是一个组合

 SELECT ID, max(score) FROM tbl GROUP BY ID, score ORDER BY ID

select * from tbl where score = (select max (score) from tbl)

我试过了

select * from tbl where score = (select max (score) from tbl GROUP BY ID)

当然它说我在一个子查询中有多行。我想要那些多行我不想将其限制为 1。

我试过了

 SELECT * FROM tbl AS tbl1
 JOIN 
(select * from tbl where score = (select max (score) from tbl)) 
ON tbl1.ID=tbl.ID

但是它说“FROM 中的子查询必须有一个别名”我给所有子查询都设置了别名,但我仍然有这个错误。

最佳答案

一种方法是使用 CTE :

WITH themaxes AS
(SELECT id, max(score) AS maxscore FROM tbl GROUP BY ID)
SELECT t.* FROM tbl t INNER JOIN themaxes m ON m.id = t.id AND m.maxscore = t.score;

另一种方法是使用 window function (此示例使用带别名的子查询):

SELECT id,score FROM 
(SELECT rank() OVER (PARTITION BY id ORDER BY score DESC) AS therank, * FROM tbl) t 
WHERE therank = 1

关于postgresql - 为每个 ID 选择最大值(包括一个 ID 有多个最大值的可能性!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40344359/

相关文章:

mysql - 在其他选择语句中选择最大值并显示嵌套选择中的相关字段

sql - PostgreSQL:如何更新表中的日期?

oracle - 将使用 Oracle mod_plsql 的应用程序移植到 PostgreSQL

postgresql - 包含覆盖世界的六边形网格坐标的表格

python - 混合 PostgreSQL 和 MongoDB(作为 Django 后端)

php - SELECT MAX(... 在 PHP/MYSQL 中不返回任何内容

mysql - GROUP_CONCAT() 不能单独使用?

algorithm - 最大连续负和或最小正子序列和问题

python - 优化数组中的计数

postgresql - 避免在 PostgreSQL 8.3.4 中嵌套聚合函数