Агрегирование
Виклад матеріалу даного підрозділу необхідно почати з розяснення того, що версія операції SUMMARIZE, описана тут, не збігається з тією, яка розглядалася в попередніх виданнях цієї книги Насправді, це – вдосконалена версія, в якій подолані деякі складнощі, що виникали в попередній версії у звязку з обробкою порожніх відносин
Як було показано вище, операція розширення надає певний спосіб включення в реляційну алгебру так званихгоризонтальних обчислень,або обчислень, здійснюваних в межах кортежу. Операція агрегування виконує аналогічну функцію для так званих вертикальних обчислень, або обчислень, здійснюваних в межах атрибута. Наприклад, в результаті обчислення наступного виразу
SUMMARIZE SP PER P {Р #} ADD SUM (QTY) AS TOTQTY
формується ставлення з атрибутами Р # і TOTQTY, в якому є по одному кортежу для кожного значення Р # в проекції відносини Р по атрибуту Р #, який містить це значення Р # і відповідне загальна кількість (Рис 711) Іншими словами, ставлення SP концептуально підрозділяється на групи, або безлічі кортежів (де є по одній групі для кожного номера деталі відносно Р), після чого кожна така група використовується для вироблення одного кортежу у складі загального результату
Рис 711 Приклад застосування операції 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 має значення у вигляді відношення Додаткова інформація на цю тему приведена в розділі 64 .
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 с: Ил – Парал тит англ
Схожі статті:
- JavaScript (0)
- Трохи про PHP. (0)
- Випадають меню за допомогою CSS (0)
- Зовнішні критерії релевантності (0)
- Cookies в PHP. (0)
- Росія: піратам влаштували прочуханку перед переговорами по СОТ (0)
- Звітність IBM Rational ClearCase. Частина 2 (0)
Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.
Коментарів поки що немає.
Ваш отзыв
Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>