我有一张如下表格
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次,则忽略第3个结果
ID | s_id | mark
-----------------------
1 | 2 | 10
2 | 2 | 9
3 | 3 | 7
4 | 5 | 9
5 | 5 | 8
6 | 7 | 8
答案 0 :(得分:2)
假设您正在使用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)
对,请告诉我们,并在查询中添加一个小的更正。
<强>输出:强>
在这里演示:
答案 1 :(得分:1)
试试这段代码。
;WITH cte
AS (
SELECT ROW_NUMBER() OVER (PARTITION BY s_id
ORDER BY ( SELECT 0)) RN,ID,s_id,mark
FROM aaa)
select RN,ID,s_id,mark FROM cte
WHERE RN <= 2
order by s_id,mark desc;