дальше у нас есть такой запрос
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;
Ну и так далее...
Комментариев нет:
Отправить комментарий