Получение первых записей интервалов агрегирования (FIRST_VALUE)
Функция
Определяет для каждой записи выборки первое значение в её интервале агрегирования.
Спецификация
<первая запись>
::=FIRST_VALUE(значимое выражение) [OVER-спецификация]
Синтаксические правила
-
<Значимое выражение>задает имя упорядочиваемого столбца.create or replace table rank_exmp(i int, j int); insert into rank_exmp (i,j) values (1, 100); insert into rank_exmp (i,j) values (1, 700); insert into rank_exmp (i,j) values (2, 200); select first_value(i) from rank_exmp; | 1|
-
<Значимые выражения>в<OVER-спецификации>задают столбцы выборки, по которым выполняется разбивка выборки на интервалы агрегирования. -
<Имена столбцов>в<ORDER BY-спецификации>внутри<OVER-спецификации>задают имена упорядочиваемых столбцов.
Общие правила
-
Для каждой записи выборки возвращается первое значение того интервала агрегирования, которому принадлежит эта запись.
create or replace table ntest(i int, j int); insert into ntest values(1,NULL); insert into ntest values(2,NULL); insert into ntest values(2,NULL); insert into ntest values(2,20); insert into ntest values(3,30); insert into ntest values(3,NULL); insert into ntest values(3,NULL); insert into ntest values(4,40); insert into ntest values(4,NULL); insert into ntest values(4,41); insert into ntest values(5,50); select * from ntest; I J - - | 1| | | 2| | | 2| | | 2| 20| | 3| 30| | 3| | | 3| | | 4| 40| | 4| | | 4| 41| | 5| 50| select i as "Интервал", nvl(cast first_value(j) over(partition by i) as char, 'null') as "Первое значение" from ntest; Интервал Первое значение -------- --------------- | 1|NULL | | 2|NULL | | 2|NULL | | 2|NULL | | 3|30 | | 3|30 | | 3|30 | | 4|40 | | 4|40 | | 4|40 | | 5|50 | -
Если значение первой записи равно NULL, возвращается также NULL.
Пример
Для каждого владельца авто получить сведения о марке его авто, возрасте владельца авто и максимальном возрасте среди всех владельцев аналогичных авто.
select auto.model, person.name, person.age,
first_value(person.age)
over(partition by auto.model order by person.age desc)
from auto,person
where auto.personid=person.personid
order by auto.model;
| 124 SPORT COUPE | POORE | 33 | 68 |
| 124 SPORT COUPE | TANIMOTO | 56 | 68 |
| 124 SPORT COUPE | HALL | 45 | 68 |
| 124 SPORT COUPE | PRATT | 43 | 68 |
| … | | | |
| 1275 GT | MERTA | 48 | 52 |
| 1275 GT | MCDONALD | 52 | 52 |
| 1302 S | POORE | 64 | 64 |