Страницы

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

пятница, 13 марта 2020 г.

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

#sql_server #функции


Странная работа оконных функций 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: )

    


Ответы

Ответ 1



Немного модифицируем ваш запрос: 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 до текущей строки.

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

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