При просмотре результатов второго запроса можно
заметить, что сервер не стал ругаться на указание колонки ID_Trans в выборке, несмотря на отсутствие агрегирующей функции или группировки по этой колонке.
Для «обычных» агрегатов хотя бы одно из этих условий обязательно должно
соблюдаться, поскольку в противном случае возникнет неоднозначность –Но на
аналитические агрегаты вышеописанное ограничение не распространяется, поскольку
степень детализации не уменьшается и, как следствие, не возникает
неоднозначности. Что и можно наблюдать на примере второго запроса – результат
агрегирующей функции просто продублировался для каждой записи внутри группы, поскольку результат агрегата для каждой записи внутри «окна» совпадает.
Самое время разобраться с синтаксисом – он довольно
прост. После функции указывается конструкция
OVER
([PARTITION BY <value_expression> , ... [n]])
|
где <value_expression> – список полей, по
которым производится группировка, при этом использование алиасов или выражений
не допускается. Собственно, таким образом и формируется «окно» для работы
аналитической функции. В «окно» попадают все записи, сгруппированные по
указанной колонке. Эта группировка делает практически то же самое, что и
оператор GROUP BY, но с парой отличий. Во-первых, как уже говорилось, такая
группировка производится по уже сформированной выборке, а во-вторых, она распространяется
только на тот агрегат, после которого идет конструкция OVER (…), а не на все
колонки. И если есть необходимость использовать две аналитические функции в
одном запросе, то для каждой функции конструкция OVER (…) указывается отдельно.
Строго говоря, результат запроса с аналитической
суммой полностью аналогичен результату такого запроса, написанного в «старом
стиле»:
SELECT s.ID_Trans, s.ID_Customer, t.sum_amount
FROM sample s
INNER JOIN
(SELECT sum(Amount)
sum_amount, ID_Customer
FROM sample
GROUP BY ID_Customer
) t
ON s.ID_Customer =
t.ID_Customer
|
Более того, планы обоих запросов также абсолютно
идентичны. Но, во-первых, запись с применением аналитических агрегатов выглядит
короче и понятнее, а во вторых, не стоит забывать, что мы имеем дело все еще не
с финальной версией продукта и, возможно, к релизу сервер научится их
оптимизировать.
В качестве аналитических функций могут также выступать
и собственноручно написанные агрегаты.
Функции ранжирования
Помимо обычных агрегатов, для аналитических запросов
вводятся функции ранжирования. Эти функции возвращают ранг каждой записи внутри
«окна». В общем случае рангом является некое число отражающее положение или
«вес» записи относительно других записей в том же наборе. Формируется «окно»
точно так же, как и в случае агрегатных функций – с помощью группировки.
Однако, поскольку результат работы функций ранжирования зависит от порядка
обработки записей, то обязательно должен быть указан порядок записей внутри
«окна» посредством конструкции ORDER BY. В зависимости от используемой функции
некоторые записи могут получать один и тот же ранг. Функции ранжирования
являются не детерминированными, то есть при одних и тех же входных значениях
они могут возвращать разный результат.
Рекомендуем скачать другие рефераты по теме: казахстан реферат, курсовики скачать бесплатно.
Предыдущая страница реферата |
1
2
3
4
5
6
7 |
Следующая страница реферата