Запрос SQL Server для разбиения данных - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть требование присваивать студентам последовательные номера.Проблема заключается в том, что сначала данные должны быть разделены по курсам, а затем должен быть присвоен номер, начиная с 1, скажем, 1000.

Каждый курс должен иметь, по крайней мере, пробел, скажем 20 (может отличаться), чтобы соответствоватьстудент в том же курсе в случае, кто-то, если не учтено, как теперь появляется позже.

enter image description here

и т. д.

Я пробовал разделение и Recursive CTE, но мне не удалось получить серию такого рода для окончательного назначения номера RollNumber.

Любая помощь будет очень ожидаемой.

Спасибо.

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете сделать это в два этапа с помощью подзапроса. Сначала получите ваш row_number(), разделенный на course и упорядоченный по student id, затем вы можете увеличить каждый раздел на 20, посчитав предыдущие значения 1, возвращенные вашим row_number(), и умножив на 20.

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 |
+------+--------+-----------+

Это не совсем то, что вам нужно, но я думаю, что это то же самое, что и после. Тем не менее, вы можете использовать математику в этом основном запросе и переводить начальную позицию каждого раздела в любое положение.

...