|
Программирование >> Хронологические базы данных
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), после чего для каждой полученной группы сгенерирован один кортеж, помещаемый в окончательный результат.
Рис. 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 Результат его вычисления будет выглядеть так.
Другими словами, результат содержит по одному кортежу для каждого из трех упоминаемых в отношении Р городов (Лондона, Парижа и Рима), причем в каждом кортеже показано количество поставок деталей из соответствующего города. Сделаем некоторые выводы. 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]. Таким образом, в этом контексте они образуют единственную группу, для которой в конечном результате будет построен всего один кортеж. Другими словами, обобщающая
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |