Страницы

Поиск по вопросам

суббота, 1 июня 2019 г.

Странная работа оконных функций min max в ms sql 2012 при обработке null

Странная работа оконных функций min, max в ms sql 2012 при обработке null–значений. 2 запроса
select max(q1) OVER(PARTITION BY q2 order by q1) from ( select null as q1, 1 as q2, 0 as q3 union select 11, 1, 1 union select null, 1, 1 ) a
select max(q1) OVER(PARTITION BY q2) from ( select null as q1, 1 as q2, 0 as q3 union select 11, 1, 1 union select null, 1, 1 ) a
Результат первого
NULL NULL 11
Второго
11 11 11
Казалось бы причём тут в функциях min max order by...
Microsoft SQL Server 2012 - 11.0.5058.0 (X64) May 14 2014 18:34:29 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)
и
Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Feb 20 2014 20:04:26 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 (Build 9600: )


Ответ

Немного модифицируем ваш запрос:
select max(q1) OVER(PARTITION BY q2 order by q3), min(q1) OVER(PARTITION BY q2 order by q3), sum(q3) OVER(PARTITION BY q2 order by q3), max(q1) OVER(PARTITION BY q2), sum(q3) OVER(PARTITION BY q2) from ( select null as q1, 1 as q2, 0 as q3 union select 12, 1, 1 union select 11, 1, 2 ) a
Результат:
NULL NULL 0 12 3 12 12 1 12 3 12 11 3 12 3
Видно, что у выражений без ORDER BY берется требуемое значение для всего окна, а для предложений с сортировкой - берется накопленное на данный момент значение в порядке сортировки.
Теперь открываем документацию, раздел "Общие примечания":
Если предложение ORDER BY не указано, то для рамки окна используется весь раздел. Это относится только к тем функциям, которым не требуется предложение ORDER BY. Если предложение ROWS или RANGE не указаны, а указано предложение ORDER BY, то в качестве значения по умолчанию для рамки окна используется RANGE UNBOUNDED PRECEDING AND CURRENT ROW
Собственно в документации сказано именно то, что мы увидели в результате запроса. Если order by указан, то функции к которым это применимо, рассматривают окно он начала раздела заданного partition by до текущей строки.

Комментариев нет:

Отправить комментарий