Сравнение аналитических функций и обычных функций агрегирования

dbstalker, 21 июня

Много встроенных функций ORACLE использует как в функциях агрегирования, так и в аналитических функциях. Есть ли отличия в результате, который получаем с помощью аналитической функции и с помощью агрегированной функции? Отличия есть, и мы их можем увидеть на простеньких примерчиках построенных на основе функции max.

Рассмотрим два запроса и результаты их выполнения.

CREATE TABLE DBST_TABL
 (CITY    VARCHAR2(20 BYTE),
  NAME    VARCHAR2(30 BYTE),
  PERIOD  VARCHAR2(6 BYTE),
  GOODS   VARCHAR2(6 BYTE));

insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200601','t0');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200601','t0');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200601','t0');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200601','t0');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200601','t1');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200601','t2');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200601','t3');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200602','t1');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200602','t2');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200603','t3');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200603','t4');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n1','200603','t5');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n2','200601','t0');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n2','200601','t2');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n2','200601','t3');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n2','200601','t4');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n4','200603','t3');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n4','200603','t4');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n4','200603','t5');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n4','200604','t1');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n4','200604','t2');
insert into  dbst_tabl (city,name,period,goods) values ('c1','n4','200604','t3');
insert into  dbst_tabl (city,name,period,goods) values ('c2','n2','200601','t0');
insert into  dbst_tabl (city,name,period,goods) values ('c2','n2','200601','t2');
insert into  dbst_tabl (city,name,period,goods) values ('c2','n2','200601','t3');
insert into  dbst_tabl (city,name,period,goods) values ('c2','n2','200601','t4');
insert into  dbst_tabl (city,name,period,goods) values ('c2','n3','200601','t5');
insert into  dbst_tabl (city,name,period,goods) values ('c2','n3','200602','t1');
insert into  dbst_tabl (city,name,period,goods) values ('c2','n3','200602','t2');
insert into  dbst_tabl (city,name,period,goods) values ('c2','n4','200603','t3');
insert into  dbst_tabl (city,name,period,goods) values ('c3','n4','200603','t4');
insert into  dbst_tabl (city,name,period,goods) values ('c3','n4','200603','t5');
insert into  dbst_tabl (city,name,period,goods) values ('c3','n4','200604','t1');
insert into  dbst_tabl (city,name,period,goods) values ('c3','n4','200604','t2');

Получаем следующую таблицу:

CITY|NAME|PERIOD|GOODS
c1|n1|200601|t0|
c1|n1|200601|t0|
c1|n1|200601|t0|
c1|n1|200601|t0|
c1|n1|200601|t1|
c1|n1|200601|t2|
c1|n1|200601|t3|
c1|n1|200602|t1|
c1|n1|200602|t2|
c1|n1|200603|t3|
c1|n1|200603|t4|
c1|n1|200603|t5|
c1|n2|200601|t0|
c1|n2|200601|t2|
c1|n2|200601|t3|
c1|n2|200601|t4|
c1|n4|200603|t3|
c1|n4|200603|t4|
c1|n4|200603|t5|
c1|n4|200604|t1|
c1|n4|200604|t2|
c1|n4|200604|t3|
c2|n2|200601|t0|
c2|n2|200601|t2|
c2|n2|200601|t3|
c2|n2|200601|t4|
c2|n3|200601|t5|
c2|n3|200602|t1|
c2|n3|200602|t2|
c2|n4|200603|t3|
c3|n4|200603|t4|
c3|n4|200603|t5|
c3|n4|200604|t1|
c3|n4|200604|t2|

а теперь:

SELECT  CITY, NAME, max(GOODS) FROM DBST_TABL group by CITY, NAME

Результат

CITY|NAME|MAX(GOODS)
c1|n1|t5|
c1|n2|t4|
c1|n4|t5|
c2|n2|t4|
c2|n3|t5|
c2|n4|t3|
c3|n4|t5|

Сравните с результатом следующего запроса:

SELECT  CITY, NAME, PERIOD,max(GOODS) over ( partition by CITY, NAME ) FROM DBST_TABL
CITY|NAME|PERIOD|MAX(GOODS)OVER(PARTITIONBYCITY,NAME)
c1|n1|200601|t5|
c1|n1|200601|t5|
c1|n1|200601|t5|
c1|n1|200601|t5|
c1|n1|200602|t5|
c1|n1|200602|t5|
c1|n1|200603|t5|
c1|n1|200603|t5|
c1|n1|200603|t5|
c1|n1|200601|t5|
c1|n1|200601|t5|
c1|n1|200601|t5|
c1|n2|200601|t4|
c1|n2|200601|t4|
c1|n2|200601|t4|
c1|n2|200601|t4|
c1|n4|200603|t5|
c1|n4|200603|t5|
c1|n4|200603|t5|
c1|n4|200604|t5|
c1|n4|200604|t5|
c1|n4|200604|t5|
c2|n2|200601|t4|
c2|n2|200601|t4|
c2|n2|200601|t4|
c2|n2|200601|t4|
c2|n3|200601|t5|
c2|n3|200602|t5|
c2|n3|200602|t5|
c2|n4|200603|t3|
c3|n4|200603|t5|
c3|n4|200603|t5|
c3|n4|200604|t5|
c3|n4|200604|t5|

Как получился такой результат?

Я это вижу таким образом:

Таблица разбивается по секциям (разделам) относительно CITY, NAME. Над каждой секцией проводиться операция max(GOODS). Затем получаем результат путем добавления к каждой записи значения max(GOODS) в зависимости от принадлежности записи к определённой секции (разделу). Подробно посмотрите в моей статье про аналитические функции.

Тэги: функции

ОднаКнопка

 

Новый комментарий

Я не спамер: введите суму 1+5



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Шины бу
26 апреля, 2 ответа
Потрібна порада
25 апреля, 2 ответа
Посоветуйте адвоката
25 апреля, 1 ответа