MS SQL 2005: оконные функции
От: Иван Бодягин Австрия http://rsdn.ru
Дата: 19.03.05 07:59
Оценка: 870 (13)
Статья:
MS SQL 2005: оконные функции
Автор(ы): Иван Бодягин (Merle)
Дата: 14.03.2005
Рассмотрена задача обеспечения серверной защиты реляционных данных на уровне отдельных строк.


Авторы:
Иван Бодягин

Аннотация:
Ввиду того, что в следующей версии MS SQL Server, выход которой ожидается в 2005 году, нововведений просто безумное количество, слона приходится есть по частям. Данный кусочек посвящен новой функциональности называемой «оконные функции» (Window Functions), также известной широкой общественности под именем «аналитических», или OLAP-функций.
Мы уже победили, просто это еще не так заметно...
Re: MS SQL 2005: оконные функции
От: Merle Австрия http://rsdn.ru
Дата: 19.01.06 10:46
Оценка:
Пока вспомнил, по итогам "платформы"...

Дополнительные аналитические функции и возможности по построению "окна", возможно появятся в первом сервис-паке. А вот учет атрибута сортировки при обработке агрегата скорее всего появится только в следующей версии сиквела.
Мы уже победили, просто это еще не так заметно...
Re: MS SQL 2005: оконные функции
От: Tigor Россия  
Дата: 14.12.06 14:12
Оценка:
Большое спасибо за статью.

Седня столкнулся с проблемой.
Нижеприведенный запрос работает неправильно из-за оптимизации выполняемой сиквелом.
Оптимизатор видит условие
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

возвращает не пустую выборку, а совсем другою строку
К сожалению, в действительности все выглядит иначе, чем на самом деле.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.