Некоторые примеры использования
Как уже говорилось, практически все, что можно сделать
с помощью аналитических функций, можно сделать и без них, но с их
использованием требуемого эффекта можно добиться проще и, зачастую, оптимальнее...
Поскольку теперь появилась возможность нумеровать
записи в выборке, можно воспользоваться этим для постраничной выдачи
результата. Запрос будет выглядеть примерно так:
WITH Numbered
(
SELECT ROW_NUMBER() OVER(ORDER
BY name) N_Row, *
FROM sysobjects
)
SELECT * FROM Numbered WHERE N_Row between @First AND @Last
|
Как ни странно, этот запрос будет выполняться примерно
в два раза быстрее классического:
EXECUTE ('SELECT * FROM
(SELECT TOP ' + @Count + '
* FROM
(SELECT TOP ' + @Last + '
*
FROM sysobjects ORDER BY
name ASC
) SO1
ORDER BY name DESC) SO2
ORDER BY name')
|
Так что сбылась еще одна мечта, об эффективной и
простой постраничной выборке.. :)
Еще один пример, где использование аналитических функций
может быть и удобным, и эффективным. Нередко требуется вывести, например, два
самых крупных заказа для каждого клиента. Может случиться так, что заказов с
максимальной суммой окажется больше двух. Для случая, когда заказов должно быть
именно два, запрос может выглядеть так: