Mysql 涉及带条件的部分组的SQL查询?
以下是我无法理解正确方法的SQL查询问题: 数据库表:Mysql 涉及带条件的部分组的SQL查询?,mysql,sql,database,postgresql,Mysql,Sql,Database,Postgresql,以下是我无法理解正确方法的SQL查询问题: 数据库表: Employee: emp_id, emp_name Credit: credit_id, emp_id, credit_date, credit_amount debit: debit_id, emp_id, debit_date, debit_amount 在这里,每个人都可以有多重收入和支出 查询要求:每天结束时,每个员工都会有一些资产(“至今贷记”-“至今贷记”)。我们需要在最大资产方面找到前五名员工,以及他们拥有最大资产的日期
Employee: emp_id, emp_name
Credit: credit_id, emp_id, credit_date, credit_amount
debit: debit_id, emp_id, debit_date, debit_amount
在这里,每个人都可以有多重收入和支出
查询要求:每天结束时,每个员工都会有一些资产(“至今贷记”-“至今贷记”)。我们需要在最大资产方面找到前五名员工,以及他们拥有最大资产的日期
我尝试了以下查询,但似乎遗漏了一些内容:
select Credit.emp_id, Credit.date, (Credit.income_amount - Debit.credit_amount) from
(select emp_id, sum(amount) as credit_amount
from credit) Credit
LEFT JOIN LATERAL (
select emp_id, sum(amount) as debit_amount
from debits
where debits.emp_id = Credit.emp_id and Credit.date >= debits.date
group by debits.emp_id
) Debit
ON true
Group by和sum允许您将每个人的总积分记录到一个记录中。您可以在子查询中执行类似的操作来减去借方
Select top 5 emp_id, credit_date, (sum(credit_amount) -
(select sum(debit_amount) from debit d
where c.emp_id = d.emp_id and c.credit_date = d.debit_date)
) as total
from Credit c group by emp_id, credit_date order by total
Group by和sum允许您将每个人的总积分记录到一个记录中。您可以在子查询中执行类似的操作来减去借方
Select top 5 emp_id, credit_date, (sum(credit_amount) -
(select sum(debit_amount) from debit d
where c.emp_id = d.emp_id and c.credit_date = d.debit_date)
) as total
from Credit c group by emp_id, credit_date order by total
在这里,我将打破查询,使其更具可读性 首先,我们需要得到贷方和借方在一天级别上的总金额,这样我们就可以使用相同的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),
现在我们需要完全外部连接“credit”和“debit”子查询
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),
ranks as (select emp_id,date,total_balance,
rank() over (partition by emp_id order by total_balance desc) as rank
from total_balance ),
现在,我们需要使用rank()函数根据emp_id的总余额(desc)分配排名(即,对于特定emp_id,rank=1将分配给一天中最大的总余额)。查询如下所示
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),
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的行(即emp_id的一天总余额的最大值和它最大值的日期)。
按总余额降序排列,并选择前5行
emp_order as (select emp_id,date,total_balance
from ranks
where rank=1
order by 3 desc
limit 5)
现在从employee表中选择名称
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
在这里,我将打破查询,使其更具可读性 首先,我们需要得到贷方和借方在一天级别上的总金额,这样我们就可以使用相同的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),
现在我们需要完全外部连接“credit”和“debit”子查询
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),
ranks as (select emp_id,date,total_balance,
rank() over (partition by emp_id order by total_balance desc) as rank
from total_balance ),
现在,我们需要使用rank()函数根据emp_id的总余额(desc)分配排名(即,对于特定emp_id,rank=1将分配给一天中最大的总余额)。查询如下所示
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),
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的行(即emp_id的一天总余额的最大值和它最大值的日期)。
按总余额降序排列,并选择前5行
emp_order as (select emp_id,date,total_balance
from ranks
where rank=1
order by 3 desc
limit 5)
现在从employee表中选择名称
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
听起来您需要一个函数来运行计算、存储结果,然后将它们相互比较以找到五名员工。你能分享一下你的尝试吗?请看,听起来您需要一个函数来运行计算、存储结果,然后将它们相互比较以找到五名员工。你能分享一下你的尝试吗?请看请看,不解释就回答是没有帮助的。我们必须计算出他在任何一天的最大资产。在每个贷记日-(他到该日的贷记总额-到该日的贷记总额=到该日的余额总额)。我们每天都要计算这个,然后给出答案请看,不解释就回答是没有帮助的。我们必须计算他在任何一天的最大资产。在每个贷记日-(他到该日的贷记总额-到该日的贷记总额=到该日的余额总额)。我们每天都要计算,然后给出答案