用于分区数据的SQL Server查询

问题描述 投票:1回答:1

我要求为学生分配序号。问题是必须首先对数据进行分区,然后必须从1开始分配数字到1000。

每个课程应至少有一个差距为20(可能不同)以容纳同一课程的学生,如果有人,如果现在遗漏,如果以后出现。

enter image description here

等等。

我已经尝试过分区和递归CTE但是没有成功获得这种系列来最终分配RollNumber。

任何帮助都会非常期待。

谢谢。

sql-server common-table-expression partition
1个回答
1
投票

您可以使用子查询分两步完成此操作。首先让你的row_number()course划分并按student id排序,然后你可以通过计算20返回的先前1值乘以20来使每个分区碰到row_number()

SELECT
    s_no, 
    course, 
    rownumber + (SUM(CASE WHEN rownumber = 1 THEN 1 ELSE 0 END) OVER (ORDER BY course, s_no ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) * 20) - 20
FROM
    (
        SELECT
            s_no, 
            course, 
            ROW_NUMBER() OVER (PARTITION BY course ORDER BY s_no) rownumber
        FROM test
    ) sub
ORDER BY course, s_no;


+------+--------+-----------+
| s_no | course | rownumber |
+------+--------+-----------+
|    1 | A      |         1 |
|    2 | A      |         2 |
|    3 | A      |         3 |
|    1 | B      |        21 |
|    2 | B      |        22 |
|    3 | B      |        23 |
|    1 | C      |        41 |
|    2 | C      |        42 |
|    3 | C      |        43 |
+------+--------+-----------+

这不完全是您想要的输出,但我认为它与您所追求的相同。您可以使用该主查询中的数学运算,并将每个分区的起始位置添加到您想要的任何位置。

© www.soinside.com 2019 - 2024. All rights reserved.