如果相同的id重复,则限制行

时间:2017-08-09 09:45:37

标签: sql-server

我有一张如下表格

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

2 个答案:

答案 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)对,请告诉我们,并在查询中添加一个小的更正。

<强>输出:

enter image description here

在这里演示:

Rextester

答案 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;