我有一个如下表
ID | s_id | mark
-----------------------
1 | 2 | 10
2 | 5 | 9
3 | 7 | 8
4 | 2 | 8
5 | 2 | 10
6 | 5 | 7
7 | 3 | 7
8 | 2 | 9
9 | 5 | 8
我需要获取 SQL 查询的输出,例如:- 标记列需要按降序排列。 相同的 s_id 不应重复超过 2 次 如果相同的s_id重复超过2次,则忽略第三个结果
ID | s_id | mark
-----------------------
1 | 2 | 10
2 | 2 | 9
3 | 3 | 7
4 | 5 | 9
5 | 5 | 8
6 | 7 | 8
最佳答案
假设您使用的是 SQL Server,则只需使用 ROW_NUMBER()
为每个 s_id
分配行号基于 mark
降序排列的组柱子。然后,仅保留行号为 1 或 2 的记录。
SELECT
t.ID, t.s_id, t.mark
FROM
(
SELECT ID, s_id, mark, ROW_NUMBER() OVER (PARTITION BY s_id ORDER BY mark DESC) rn
FROM yourTable
) t
WHERE t.rn <= 2
ORDER BY t.s_id;
注意:您会注意到记录 (s_id, mark) = (2, 10)
在我的结果集中出现两次。根据您的输入数据,将生成以下内容。如果您确实打算删除重复的 (s_id, mark)
对,然后让我们知道,并且可以在查询中添加一个小修正。
输出:
此处演示:
Rextester
关于sql-server - 如果相同的 id 重复,则限制行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45587123/