Статья:
MS SQL 2005: оконные функцииАвтор(ы): Иван Бодягин (Merle)
Дата: 14.03.2005
Рассмотрена задача обеспечения серверной защиты реляционных данных на уровне отдельных строк.
Авторы:
Иван Бодягин
Аннотация:
Ввиду того, что в следующей версии MS SQL Server, выход которой ожидается в 2005 году, нововведений просто безумное количество, слона приходится есть по частям. Данный кусочек посвящен новой функциональности называемой «оконные функции» (Window Functions), также известной широкой общественности под именем «аналитических», или OLAP-функций.
Пока вспомнил, по итогам "платформы"...
Дополнительные аналитические функции и возможности по построению "окна", возможно появятся в первом сервис-паке. А вот учет атрибута сортировки при обработке агрегата скорее всего появится только в следующей версии сиквела.
Большое спасибо за статью.
Седня столкнулся с проблемой.
Нижеприведенный запрос работает неправильно из-за оптимизации выполняемой сиквелом.
Оптимизатор видит условие
company_id is not null
во внешнем запросе, и решает что можно заменить
left join
на
inner join
. (Это видно по плану запроса). В результате оконная функция выполняется над неправильной выборкой.
Если вместо
company_id is not null
написать
isnull(company_id, 0) != 0
, то всё рабоает правильно, так как оптимизатор не изменяет тип джойна.
select
*
from
(
select
mc.company_id,
dense_rank() over (order by mc.company_id) as rank
from
dbo.COMPANY c
left join
dbo.MATTER_COMPANY mc on
c.company_id = mc.company_id
) x
where
rank = 1 and
company_id is not null
Если такая штука (без последней строки) внутри udf, то эффект вообще потрясающий. Люди просто офигевают
Например, запрос вида
select company_id from my_udf()
возвращает одну строчку, где company_id равно null.
А запрос
select company_id from my_udf() where company_id is not null
возвращает не пустую выборку, а совсем другою строку