Здесь я разбиваю запрос, чтобы сделать его более читабельным.
Прежде всего, нам нужно получить общую сумму на уровне дня как для кредита, так и для дебета, чтобы мы могли присоединиться таблица кредита и дебета на уровне дня с тем же emp_id.
with
credit as(
select emp_id,credit_date date,sum(credit_amount) as amount
from credit
group by 1,2),
debit as(
select emp_id,debit_date,sum(debit_amount) as amount
from expenses
group by 1,2),
Теперь нам нужно полное внешнее объединение подзапросов "кредит" и "дебет"
payments as (
select distinct
case when c.emp_id is null then d.person_id else c.emp_id end as emp_id ,
case when c.emp_id is null then d.date else c.date end as date,
case when c.emp_id is null then 0 else i.amount end as credit ,
case when d.emp_id is null then 0 else d.amount end as debit
from credit c
full outer join debit d on d.emp_id=c.emp_id and d.date=c.date
),
Теперь мы возьмите накопленную сумму за день для кредита, дебета и общего баланса, как показано ниже.
total_balance as(
SELECT emp_id, date,
sum(credit) OVER (PARTITION BY emp_id ORDER BY date asc) AS total_credit,
sum(debit) OVER (PARTITION BY emp_id ORDER BY date asc) AS total_debit,
(sum(income) OVER (PARTITION BY person_id ORDER BY date asc) -
sum(expense) OVER (PARTITION BY person_id ORDER BY date asc)) as total_balance
FROM group_payment
ORDER BY person_id, date),
Теперь нам нужно использовать функцию rank () для присвоения рейтинга на основе общего баланса (des c) для emp_id (ie. rank = 1 будет назначен наибольшему общему остатку за день для определенного emp_id). Запрос показан ниже.
ranks as (select emp_id,date,total_balance,
rank() over (partition by emp_id order by total_balance desc) as rank
from total_balance ),
Теперь выберите строки, имеющие ранг = 1 (ie. MAX of total_balance на день для emp_id и дату, на которую он был MAX). Закажите это по убыванию total_balance и выберите 5 верхних строк
emp_order as (select emp_id,date,total_balance
from ranks
where rank=1
order by 3 desc
limit 5)
Теперь выберите имя из таблицы сотрудников.
select emp_id,name, date, total_balance as balance
from emp_order eo
join Employee e on e.emp_id = eo.emp_id
order by 4 desc