Агрегирующие функции в OVER

Хочу разобраться, как искать максимальную или минимальную дату в подгруппах по другому столбцу таблицы.

Например, есть таблица DF, в которой 3 колонки:
(Клиент, номер анкеты, и дата заведения анкеты)

IDCLIENT IDBLANK DT
1 1 2021-03-01
1 2 2021-03-02
1 3 2021-03-03
2 4 2021-03-02
2 5 2021-03-03
2 6 2021-03-04
3 7 2021-03-03
3 8 2021-03-04
3 9 2021-03-05

Нужно найти минимальную дату по каждому клиенту

Исходя из статей найденных в интернете, для этого нужно использовать OVER PARTITION BY. Мой запрос выглядит так :

select min(dt) over (partition by idclient)
from df 

Запрос вернул то, что я хотел:

IDCLIENT IDBLANK DT
1 1 2021-03-01
1 2 2021-03-01
1 3 2021-03-01
2 4 2021-03-02
2 5 2021-03-02
2 6 2021-03-02
3 7 2021-03-03
3 8 2021-03-03
3 9 2021-03-03

Теперь, цель получить первую (по дате) анкету по клиенту.

Запрос:

select
  idblank
 ,idclient
 ,dt
from df
where dt in ( -- по минимальной дате пытаюсь вытянуть номер клиента и анкету
  select 
    min(dt) over (partition by idclient)
  from df)

Но результат:

IDCLIENT IDBLANK DT
1 1 2021-03-01
1 2 2021-03-02
1 3 2021-03-03
2 4 2021-03-02
2 5 2021-03-03
3 7 2021-03-03

Не понятно, почему такой вывод, в подзапросе уникальных дат было 3, "в моем понимании", 3 анкеты должен вернуть запрос. dbfiddle

Что я делаю не так?


Ответы (1 шт):

Автор решения: 0xdb

Теперь, цель получить первую (по дате) анкету по клиенту.

Функция так и называется FIRST - получить первую(е).

Ни подзапрос, ни тем более аналитические функции в нём, тут не нужны.
Таким запросом будет получен желаемый результат (db<>fiddlle):

select idclient, 
    min (idblank) keep (dense_rank first order by dt asc) idblank, 
    min (dt)      keep (dense_rank first order by dt asc) dt
from df
group by idclient;

  IDCLIENT    IDBLANK DT                 
---------- ---------- -------------------
         1          1 2021-03-01 12:00:00
         2          4 2021-03-02 12:00:00
         3          7 2021-03-03 12:00:00

Важное замечание: Загоковок вопроса: Агрегирующие функции в OVER, показывает, что нет ещё полного понимания главного отличия агрегатных от аналитических функций. Они в принципе не могут быть "одна в другой" или "вместе", поэтому коротко для понимания:

  • Агрегатные функции (aggregate function) применяются к набору (или группе) данных и возвращают по ним одну строку с результирующим значением.
  • Аналитические функции (analytic function) начинающиеся с клаузы OVER, применяются также к набору (или группе) данных, но возвращают по ним результирующее значение для каждой строки набора (или группы) данных.
→ Ссылка