Программирование >>  Хронологические базы данных 

1 ... 60 61 62 [ 63 ] 64 65 66 ... 348


SUM ( SP WHERE S# = S# { SI ), QTY)

SUM ( ( SP WHERE S# = S#( SI ) ) { QTY } )

Обратите внимание на различие между этими двумя выражениями. Первое выражение позволяет подсчитать суммарный объем всех поставок для поставщика с номером S1, а второе - суммарный объем всех поставок различных комплектов деталей для поставщика с номером S1.

Если аргумент обобщающей функции оказывается пустым множеством, то функции COUNT и SUM возвращают значение нуль , а функции MIN и МАХ - наименьшее и наибольшее значения соответствующего домена. Функции ALL и ANY в этом случае возвращают соответственно значения истина и ложь, а функция AVG генерирует исключительную ситуацию.

Операция обобщения

Начиная этот раздел, следует сказать, что данная версия оператора SUMMARIZE отличается от версий, рассмотренных в предыдущих изданиях настоящей книги. Фактически это улучшенная версия, в которой учтены определенные трудности, возникавшие в предыдущих версиях при работе с пустыми отношениями.

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

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

В результате его вычисления создается отношение с заголовком {Pt,TOTQTY}, содержащее один кортеж для каждого значения атрибута Pi в проекции SP{Pi}. Каждый из этих кортежей содержит значение атрибута Pt и соответствующее общее количество деталей (рис. 6.11). Другими словами, концептуально исходное отношение Р перегруппировано в множество групп кортежей (по одной группе для каждого уникального значения атрибута Pt), после чего для каждой полученной группы сгенерирован один кортеж, помещаемый в окончательный результат.

TOTQTY

1000

Рис. 6.11. Пример выполнения операции SUMMARIZE В общем случае значение выражения SUMMARIZE А PER В ADD <обо6щение> AS Z определяется следующим образом.



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

Результатом вычисления данного выражения будет отношение с заголовком {А1, А2, ... , An, Z}, где Z является новым добавленным атрибутом.

Тело результата содержит все кортежи t, где t является кортежем отношения В, расширенным значением нового атрибута Z. Это значение нового атрибута Z под-считывается посредством вычисления обобщающего выражения по всем кортежам отношения А, которое имеет те же значения для атрибутов А1, А2, ... , An, что и кортеж t. (Разумеется, если в отношении А нет кортежей, принимаюших те же значения для атрибутов А1, А2, ... , An, что и кортеж t, то обобщающее выражение будет вычислено для пустого множества.) Отношение В не должно содержать атрибут с именем Z, а обобщающее выражение не должно ссылаться на атрибут Z. Заметьте, что кардинальность результата равна кардинальности отношения В, а степень результата равна степени отношения В плюс единица. Типом переменной Z э этом случае будет тип обобщающего выражения.

Вот еще один пример.

SUMMARIZE ( Р JOIN SP ) PER Р { CITY } ADD COUNT AS NSP Результат его вычисления будет выглядеть так.

CITY

London

Paris

Rome

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

Сделаем некоторые выводы.

L Предложенный синтаксис позволяет выполнять множественные операции обобщения, как, например, показано ниже. SUMMARIZE SP BY { Р# } ADD SUM ( QTY ) AS TOTQTY,

AVG ( QTY ) AS AVGQTY

2. Общая форма параметра <о6о6щение> (повторимся) имеет следующий вид.

SUMMARIZE <реляционное выражение>

PER <реляционное выражение>

ADD <список добавляемых о6о6щений>

Каждый элемент <до6авляемое о6о6щение>, в свою очередь, имеет следующий вид.

<тип обобщение [ ( <скалярное выражение> ) ] AS <имя атри6ута>



Чаще всего параметр <тип обобщение задает одну из функций count, sum, avg, MIN, max, all, any, countd, sumd и avgd. Буква d (distinct - различный) в названии функций countd, sumd и avgd означает следующее: перед выполнением этой обобщающей операции удалить все избыточные повторяющиеся значения . Параметр <скалярное выражениё> может содержать ссылки на атрибуты отношения, которое определяется параметром <реляционное выражение>, размещенным непосредственно за ключевым словом summarise.

Замечание. Параметр <скалярное выражениё> (вместе с квадратными скобками) можно опустить лишь в том случае, если параметр <тип обобщение имеет значение count.

Обратите также внимание на то, что параметр <до6авляемое о6о6щение> - это не вызов обобщающей функции, задаваемый параметром <вызов обобщающей функции>. Параметр <вызов обобщающей функциИ> задает скалярное выражение и может использоваться в любом месте, где допустим вызов оператора выборки (в частности, скалярного литерала). Параметр <до6авляемое о6о6щение> - это не скалярное значение; он является операндом оператора summarize и имеет смысл только в контексте операции обобщения.

3. Как вы, наверное, догадались, оператор summarize не примитивен- его можно моделировать с помощью оператора extend. Например, рассмотрим следующее выражение.

summarize sp per s { s# } add count as np

Ho сути, это сокращенная запись представленного ниже более сложного выражения.

{ extend s { Si }

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 }

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

summarize sp per sp { } add sum ( qty ) as grandtotal

В нем группирование и подведение итогов производятся для отношения, которое вообще не имеет атрибутов. Пусть sp - это текущее значение базовой переменной-отношения sp. Предположим, что отношение sp содержит по крайней мере один кортеж. Тогда все кортежи отношения sp будут иметь одинаковые значения по пустому множеству атрибутов, а именно- по 0-кортежу [5.5]. Таким образом, в этом контексте они образуют единственную группу, для которой в конечном результате будет построен всего один кортеж. Другими словами, обобщающая



1 ... 60 61 62 [ 63 ] 64 65 66 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика