Главная » SQL, Базы данных » Агрегирование

0

Изложение материала данного подраздела необходимо начать с разъяснения того, что версия операции SUMMARIZE, описанная здесь, не совпадает с той, которая рассматривалась в предыдущих изданиях этой книги. В действительности, это — усовершенствованная версия, в которой преодолены  некоторые сложности, возникавшие в предыдущей версии в связи с обработкой пустых отношений.

Как было показано выше, операция расширения предоставляет определенный способ включения  в  реляционную  алгебру  так  называемых  горизонтальных  вычислений,  или "вычислений, осуществляемых в пределах кортежа". Операция агрегирования выполняет аналогичную функцию для так называемых вертикальных вычислений, или "вычислений, осуществляемых в пределах атрибута". Например, в результате вычисления следующего выражения

SUMMARIZE SP PER P { Р# } ADD SUM ( QTY ) AS TOTQTY

формируется отношение с атрибутами Р# и TOTQTY, в котором имеется по одному кортежу для каждого значения Р# в проекции отношения Р по атрибуту Р#, содержащему это значение Р# и соответствующее общее количество (рис. 7.11 ). Иными словами, отношение SP концептуально подразделяется на группы, или множества кортежей (где имеется по одной группе для каждого номера детали в отношении Р), после чего каждая такая группа используется для выработки одного кортежа в составе общего результата.

Рис. 7.11. Пример применения операции SUMMARIZE

Вообще говоря, значение следующей операции агрегирования

SUMMARIZE a PER b ADD summary AS Z

представляет собой отношение, которое определено, как описано ниже.

■     Прежде всего, отношение b должно принадлежать к такому же типу, так и некото рая проекция отношения а (т.е. каждый атрибут отношения b должен быть атри бутом отношения а). Допустим, что атрибутами этой проекции (равным образом и атрибутами отношения b) являются А1,   А2,   . . .,   An.

■     Заголовок результата состоит из заголовка отношения b, дополненного атрибутом Z.

■     Тело результата состоит из всех кортежей t, таких что t является кортежем отно шения b, дополненным значением атрибута z. Это значение Z вычисляется путем выполнения операции агрегирования summary по всем кортежам отношения а,

которые имеют такие же значения атрибутов { А1, А2, . . ., An }, как  и  сам кортеж t. (Безусловно, если ни один кортеж из а не имеет такие же значения атрибутов { А1, А2, . . ., An }, как и сам кортеж t, то  вычисление операции summary происходит на пустом множестве.)

Отношение b не должно иметь атрибута Z, а операция summary не должна ссылаться на Z. Обратите внимание на то, что результат имеет кардинальность, равную кардинальности отношения b, и степень, равную степени отношения b плюс один. Типом атрибута Z в этом результате является тип операции агрегирования summary.

Ниже приведен еще один пример.

SUMMARIZE ( Р JOIN SP ) PER P { CITY } ADD COUNT AS NSP

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

Иными словами, этот результат включает по одному кортежу для каждого из трех городов, где хранятся детали (Лондона, Осло и Парижа); для каждого города в нем показано количество поставок деталей, хранящихся в этом городе.

Из сказанного следуют приведенные ниже выводы.

1.  Еще раз следует отметить, что здесь мы снова встречаем пример операции, опреде ление которой основано на понятии равенства кортежей.

2.  Показанный здесь синтаксис допускает использование "множественных операций

SUMMARIZE", например, следующим образом.

SUMMARIZE SP PER P { Р# } ADD ( SUM ( QTY ) AS TOTQTY, AVG ( QTY ) AS AVGQTY )

3.  Общая форма операции агрегирования <sumnarize> (повторим ее еще раз) со стоит в следующем.

SUMMARIZE  <relation  exp>  PER <relation  exp>

ADD  (   <summarize add commalist>  )

Каждое выражение с добавлением результата агрегирования <summarize  add>

принимает, в свою очередь, следующую форму.

<summary  type>   [     (    <scalar exp>   )    ]    AS   <attribute name>

К типичным разновидностям операции агрегирования <summary type>  относятся COUNT, SUM, AVG, MAX, MIN, ALL, ANY, COUNTD, SUMD И AVGD. Суффикс "D" (сокращение от "distinct" — различный) в операциях COUNTD, SUMD и AVGD означает "устранить избыточные дублирующиеся значения перед выполнением операции  агрегирования".  Скалярное  выражение  <scalar  exp>  может  включать ссылки на атрибуты в отношении, указанном с помощью реляционного выражения <relation   exp>, которое непосредственно следует за ключевым словом

SUMMARIZE. Скалярное выражение <scalar exp> и окружающие его  круглые скобки могут и должны быть опущены, только если типом операции агрегирования <summary type> является COUNT.

Кстати, обратите внимание на то, что выражение с добавлением  результата  агрегирования <summarize add> не равнозначно вызову  оператора агрегирования  <agg  op  inv>.  Выражение  <agg  op  inv>  является  скалярным  и  может находиться везде, где допускается применение литерала соответствующего типа. В отличие от этого,  выражение <summarize add> представляет собой просто операнд операции SUMMARIZE; оно не является скалярным выражением, не имеет смысла за пределами контекста операции SUMMARIZE И фактически не  должно появляться вне этого контекста.

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

SUMMARIZE SP PER S { S# } ADD COUNT AS NP

определено как краткая форма выражения, приведенного ниже.

( EXTEND S { S# }

ADD ( ( ( SP RENAME S# AS X ) WHERE X = S# ) AS Y, COUNT ( Y ) AS NP ) ) { S#, NP }

Указанное выражение может быть равным образом представлено в следующем виде.

WITH ( S { S# } ) AS Tl,

( SP RENAME S# AS X ) AS T2,

( EXTEND Tl ADD ( T2 WHERE X = S# ) AS Y ) AS T3, ( EXTEND T3 ADD COUNT ( Y ) AS NP ) AS T4

: T4 { S#, NP }

Кстати, в этом случае атрибут Y имеет значение в виде отношения. Дополнительная информация по этой теме приведена в разделе 6.4..

5.  Ниже приведен еще один пример.

SUMMARIZE S PER S { CITY } ADD AVG ( STATUS ) AS AVG_STATUS

В данном случае отношение, указанное вместе с ключевым словом PER, не только "относится к такому же типу, как" некоторая проекция отношения,  к которому применяется операция агрегирования, но фактически является такой проекцией. В подобном случае допускается использование следующей сокращенной формы.

SUMMARIZE S BY { CITY } ADD AVG ( STATUS ) AS AVG_STATUS

Здесь конструкция PER <relation exp> заменена конструкцией BY  <attribute name commalist>. Все имена атрибутов, указанные в этом  списке, разделенном запятыми, должны быть атрибутами отношения, к которому применяется операция агрегирования.

6.  Рассмотрим следующий пример.

SUMMARIZE SP PER SP { } ADD SUM ( QTY ) AS GRANDTOTAL

В соответствии с предыдущим пунктом, это выражение можно записать иначе, как показано ниже.

SUMMARIZE SP BY { } ADD SUM ( QTY ) AS GRANDTOTAL

В обоих случаях операции группирования и агрегирования выполняются на основе отношения, которое вообще не имеет атрибутов. Допустим, что sp — текущее значение переменной отношения SP, а также на время предположим, что отношение sp содержит по меньшей мере один кортеж. В таком случае все эти кортежи отношения sp имеют одно и то же значение, но для атрибутов, которые вообще не существуют (а именно, это один нуль-арный кортеж), поэтому в общем результате имеется лишь одна группа и, следовательно, только один кортеж (иными словами, вычисление результатов операции агрегирования выполняется точно один раз для всего отношения sp). Итак, в результате вычисления этого выражения будет получено отношение с одним атрибутом и одним кортежем; данный атрибут называется GRANDTOTAL,  и  единственное  скалярное  значение  в   единственном  результирующем кортеже представляет собой сумму всех значений QTY в первоначальном отношении sp.

Если, с другой стороны, первоначальное отношение sp вообще не содержит кортежей, то не должно быть и групп, и поэтому не должно быть  результирующих кортежей (т.е. результирующее отношение также является пустым). В отличие от этого, следующее выражение должно "действовать  правильно" (т.е. возвращать правильный результат, нуль), даже если отношение sp будет пустым.

SUMMARIZE SP PER TABLE_DEE ADD SUM ( QTY ) AS GRANDTOTAL

Точнее, оно возвратит отношение с одним атрибутом, называемым GRANDTOTAL, и с одним кортежем, содержащим значение нуль.  Поэтому,  по мнению автора, должна быть предусмотрена возможность вообще опускать конструкцию PER, как в следующем примере.

SUMMARIZE SP ADD SUM ( QTY ) AS GRANDTOTAL

По определению, исключение из выражения конструкции PER должно быть эквивалентно применению конструкции PER TABLE_DEE.

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии