Странная работа оконных функций 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 до текущей строки.
Комментариев нет:
Отправить комментарий