Доступные версии документации

Получение первых записей интервалов агрегирования
Функция

Определяет для каждой записи выборки первое значение в её интервале агрегирования.

Спецификация
   
<первая запись>::=
Синтаксические правила
  1. <Значимое выражение> задает имя упорядочиваемого столбца.

    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|
  2. <Значимые выражения> в <OVER-спецификации> задают столбцы выборки, по которым выполняется разбивка выборки на интервалы агрегирования.

  3. <Имена столбцов> в <ORDER BY-спецификации> внутри <OVER-спецификации> задают имена упорядочиваемых столбцов.

Общие правила
  1. Для каждой записи выборки возвращается первое значение того интервала агрегирования, которому принадлежит эта запись.

    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             |
  2. Если значение первой записи равно 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 |
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter