Программирование >>  Преобразование значений null 

1 ... 190 191 192 [ 193 ] 194 195 196 ... 219


в поле IN PROGRESS строки с датой последнего экзамента в группе возвратить значение 1. Для этого также может использоваться оконная функция MAX OVER:

select V.*,

max(pass fail)over(partition by

student id,grade id,period id) grp p f, max(test date)over(partition by

student id,grade id,period id) last test

from V

STUDENT ID TEST ID GRADE ID PERIOD ID TEST DATE PASS FAIL GRP P F LAST TEST

1 1 2 1 01-FEB-2005 0 1 01-APR-2005

1 2 2 1 01-MAR-2005 1 1 01-APR-2005

1 3 2 1 01-APR-2005 0 1 01-APR-2005

1 4 2 2 01-MAY-2005 0 0 01-JUL-2005

1 5 2 2 01-JUN-2005 0 0 01-JUL-2005

1 6 2 2 01-JUL-2005 0 0 01-JUL-2005

Теперь, когда определено, в какой период студент сдал экзамен и какова дата последнего экзамена, осталось просто поколдовать с форматированием и приукрасить результирующее множество. В окончательном решении для создания столбцов METREQ и IN PROGRESS используется функция Oracle DECODE (сторонники CASE, кусайте локти). Функция LPAD поможет выровнять значения METREQ по правому краю:

select student id, test id, grade id, period id, test date,

decode( grp p f,1,lpad(+,6),lpad(-,6) ) metreq, decode( grp p f,1,0,

decode( test date,last test,1,0 ) ) in progress

from ( select V.*,

max(pass fail)over(partition by

student id,grade id,period id) grp p f, max(test date)over(partition by

student id,grade id,period id) last test

from V ) x

STUDENT ID TEST ID GRADE ID PERIOD ID TEST DATE METREQ IN PROGRESS 1 1 2 1 01-FEB-2005 + 0

1 2 2 1 01-MAR-2005 + 0

1 3 2 1 01-APR-2005 + 0

1 4 2 2 01-MAY-2005 - 0

1 5 2 2 01-JUN-2005 - 0

1 6 2 2 01-JUL-2005 - 1



Оконные функции, краткий обзор

В рецептах данной книги широко используются оконные функции, введенные в стандарт ISO SQL в 2003 году, и собственные оконные функции отдельных производителей. Данное приложение является кратким обзором оконных функций. Оконные функции существенно упрощают решение многих обычно вызывающих сложности (при решении с использованием стандартных механизмов SQL) задач. Полный список доступных оконных функций, их синтаксис и подробное описание их работы вы найдете в документации своей базы данных.

Группировка

Прежде чем перейти к оконным функциям, важно понять механизм группировки в SQL. По моему опыту, идея группировки результатов в SQL является камнем преткновения для многих. Проблемы возникают из-за недопонимания принципов работы оператора GROUP BY и его влияния на результаты запросов.

Если давать простое определение, группировка - это способ организации подобных строк. При использовании GROUP BY в запросе каждая строка результирующего множества является группой и представляет одну или более строк с одинаковыми значениями в одном или более заданных полях. Вот суть группировки.

Если группа - это просто уникальный экземпляр строки, представляющий одну или более строк с таким же значением в определенном столбце (или столбцах), тогда примерами групп в таблице EMP являются все служащие 10-го отдела (общее значение, позволяющее объединить этих служащих в одну группу, - DEPTNO=10) или все клерки (общее значение, позволяющее объединить этих служащих в одну группу, - JOB=CLERK). Рассмотрим следующие запросы. Первый показывает всех служащих 10-го отдела; второй группирует служащих



select

deptno,ename

from

where

deptno=10

DEPTNO

ENAME

CLARK

KING

MILLER

select

deptno,

count(*) as

cnt,

max(sal) as

hi sal,

min(sal) as

lo sal

from

where

deptno=10

group

by deptno

DEPTNO CNT HI SAL LO SAL

10 3 5000 1300

Если бы не было возможности сгруппировать служащих 10-го отдела, для получения информации, возвращаемой вторым из приведенных выше запросов, пришлось бы самостоятельно проверять записи, соответствующие этому отделу (это просто, если таких строк всего три, а если этих строк три миллиона?). Итак, почему возникает необходимость в группировке? Причины весьма разнообразны. Может потребоваться представить, сколько существует разных групп или сколько членов (строк) в каждой группе. Как видно из простого примера, показанного выше, группировка позволяет получать информацию о многих строках таблицы, не проверяя их одну за другой.

Определение группы в SQL

В математике основным определением группы является тройка (G, , e), где G - множество, - бинарная операция над G, и e - член G. Мы будем использовать это определение как базовое для описания группы в SQL. SQL-группа определяется как пара (G, e), где G - результирующее множество самостоятельного или самодостаточного запроса, в котором используется оператор GROUP BY, e - член G, и выполняются следующие аксиомы:

Для каждого e в G e является уникальным и представляет один или более экземпляров e.

Для каждого e в G агрегатная функция COUNT возвращает значение > 0.

10-го отдела и возвращает о них следующую информацию: количество строк (членов) в группе, наибольшая заработная плата и наименьшая заработная плата:



1 ... 190 191 192 [ 193 ] 194 195 196 ... 219

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