sql-server - 如果相同的 id 重复,则限制行数

标签 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次,则忽略第三个结果

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)对,然后让我们知道,并且可以在查询中添加一个小修正。

输出:

enter image description here

此处演示:

Rextester

关于sql-server - 如果相同的 id 重复,则限制行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45587123/

相关文章:

SQL 将多行插入第二个/子表

sql - 没有聚集索引的表算堆表吗?

sql - 如何为每个人选择前N个薪资?

sql-server - Talend 出错时如何设置回滚?

sql-server - 使用新文件名的 SQL Server 还原数据库

SQL Select : Update if exists, 如果没有则插入 - 与日期部分比较?

c# - 将天数添加到 DateTime 返回值为 0?

sql-server - SQL 中的 Unicode 数据类型

多对一关系的sql查询

C# 和 SQL Server : ExecuteNonQuery returning -1, 何时更新有效?