Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

вывод последнего депозита для каждого аккаунта


дальше у нас есть такой запрос
SELECT distinct last_value(account) over(partition by account order by data desc) account, last_value(sum) over(partition by account order by data desc) sum FROM ( select account, data, sum, nth_value(data, 1) over(partition by account order by data desc) cr from accounts)x WHERE data = cr;
Выдает он последний депозит для каждого аккаунта. Как можно переписать программу, используя только одну оконную функцию?


Ответ

Можно попробовать вот так:
select account, data, sum from ( select a.*, row_number() over(partition by account order by data desc) as rn from accounts a ) where rn = 1;
Еще варианты:
RANK/DENSE_RANK
select account, sum from ( select a.*, rank() over(partition by account order by data desc, sum) as rn from accounts a ) where rn = 1; (использование dense_rank такое же),
NTH_VALUE
select account, sum from ( select a.*, nth_value(sum, 2) over(partition by account order by data desc, sum desc) as rn from accounts a ) where rn is null;
LAG
select account, sum from ( select a.*, lag(data) over(partition by account order by data desc, sum desc) as rn from accounts a ) where rn is null;
Ну и так далее...

Комментариев нет:

Отправить комментарий