Реферат: MS SQL 2005: оконные функции
union all SELECT 1, 100
union all SELECT 2, 200
Сравним результат выполнения двух запросов. В одном SUM выступает в качестве обычного агрегата:
SELECT ID_Customer, sum(Amount) FROM sample GROUP BY ID_Customer --- Результат вполне предсказуем: 1 531 2 1322 3 630 |
А в другом уже в качестве аналитической функции:
SELECT ID_Trans, ID_Customer, sum(Amount) OVER (PARTITION BY ID_Customer) FROM sample --- А здесь получим следующее: 4 1 531 5 1 531 1 1 531 12 1 531 14 1 531 15 2 1322 11 2 1322 13 2 1322 2 2 1322 6 2 1322 7 2 1322 8 3 630 9 3 630 10 3 630 3 3 630 |
При просмотре результатов второго запроса можно заметить, что сервер не стал ругаться на указание колонки ID_Trans в выборке, несмотря на отсутствие агрегирующей функции или группировки по этой колонке. Для «обычных» агрегатов хотя бы одно из этих условий обязательно должно соблюдаться, поскольку в противном случае возникнет неоднозначность –Но на аналитические агрегаты вышеописанное ограничение не распространяется, поскольку степень детализации не уменьшается и, как следствие, не возникает неоднозначности. Что и можно наблюдать на примере второго запроса – результат агрегирующей функции просто продублировался для каждой записи внутри группы, поскольку результат агрегата для каждой записи внутри «окна» совпадает.