Агрегирующие функции в 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 шт):
Теперь, цель получить первую (по дате) анкету по клиенту.
Функция так и называется 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, применяются также к набору (или группе) данных, но возвращают по ним результирующее значение для каждой строки набора (или группы) данных.