我要求为学生分配序号。问题是必须首先对数据进行分区,然后必须从1开始分配数字到1000。
每个课程应至少有一个差距为20(可能不同)以容纳同一课程的学生,如果有人,如果现在遗漏,如果以后出现。
等等。
我已经尝试过分区和递归CTE但是没有成功获得这种系列来最终分配RollNumber。
任何帮助都会非常期待。
谢谢。
您可以使用子查询分两步完成此操作。首先让你的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 |
+------+--------+-----------+
这不完全是您想要的输出,但我认为它与您所追求的相同。您可以使用该主查询中的数学运算,并将每个分区的起始位置添加到您想要的任何位置。