Вы можете сделать это в два этапа с помощью подзапроса. Сначала получите ваш 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 |
+------+--------+-----------+
Это не совсем то, что вам нужно, но я думаю, что это то же самое, что и после. Тем не менее, вы можете использовать математику в этом основном запросе и переводить начальную позицию каждого раздела в любое положение.