Comments 4
Есть еще прикольные нюансы взаимодействия таких аналитических функций с case - when
Например если сделать что-то вот такое
Case column_flag when 'Y' then 0 else row_number ...
То мы вроде как ожидаем получить 0 для одного типа столбцов, и нумерацию с 1 для другого типа
Однако база сначала расставит row_number на всех строках, а потом обернет это в case-when.
В результате нумерация второго типа столбцов вполне может начаться не с 1 - ведь она началась уже внутри случаев, которые скрыты внутри обертки с case-when
Что делать в таком случае?
Например, явно добавить такое поле в условие партицирования этого row_number, то есть
Case column_flag when 'Y' then 0 else row_number()over(partition by column_flag, ...)
Ну так это и правильно. Оконные функции обрабатывают весь набор либо всё текущее окно. С какого перепугу она бы стала из-за какого-то CASE обрабатывать только часть выходного набора?
Ranking Functions: ROW_NUMBER