SQL 具有聚合值的子查询
SQL subquery with aggregate value
抱歉标题含糊不清,我有点迷路了。我有两个简单的聚合 SQL 查询,但我很难在 IBM DB2 中以功能方式(可能通过子查询)组合它们。主要目标是 运行 INVOICES table 中的 COUNT 函数 - 但开始日期基于子查询 MAX 聚合结果。
select count(a.invno), a.item from INVOICES a
where a.invdate > 20200101
group by a.item
但如前所述,我不希望 a.invdate 得到修复 (20200101)。我需要 运行 SERVICE table 中的 MAX 函数,并将其结果用作 a.invdate 的参数。有没有合理的方法来做到这一点?
select max(b.servdate), b.item from SERVICE b
where b.servtype = 1
group by b.item
因此,希望计算自上次服务日期以来每个项目的发票(匹配它自己的参数)。很明显,这里a.item = b.item。
我想你想要 row_number()
:
select s.*
from (select s.*, row_number() over (partition by item order by servdate desc) as seqnum
from service s
where s.servtype = 1
) s
where seqnum = 1;
如果我没听错,你可以join
,或者使用相关子查询:
select count(i.invno), i.item
from invoices i
where i.invdate > (
select max(s.servdate)
from services s
where s.servtype = 1 and s.item = i.item
)
group by i.item
如果您在 services(item, servtype)
上有索引,这应该是一种有效的方法。
或者,这里是 join
方法:
select count(i.invno), i.item
from invoices i
inner join (
select item, max(servdate) servdate
from services
where servtype = 1
group by item
) s on s.item = i.item and s.invdate > s.servdate
group by i.item
因为没有其他人展示我认为最好的方式,所以我会 post 它...
select count(i.invno), i.item
from invoices i
join (
select max(s.servdate) maxd, s.item
from services s
where s.servtype = 1
group by s.item
) as sub on sub.item = i.item and a.invdate > sub.maxd
group by i.item
抱歉标题含糊不清,我有点迷路了。我有两个简单的聚合 SQL 查询,但我很难在 IBM DB2 中以功能方式(可能通过子查询)组合它们。主要目标是 运行 INVOICES table 中的 COUNT 函数 - 但开始日期基于子查询 MAX 聚合结果。
select count(a.invno), a.item from INVOICES a
where a.invdate > 20200101
group by a.item
但如前所述,我不希望 a.invdate 得到修复 (20200101)。我需要 运行 SERVICE table 中的 MAX 函数,并将其结果用作 a.invdate 的参数。有没有合理的方法来做到这一点?
select max(b.servdate), b.item from SERVICE b
where b.servtype = 1
group by b.item
因此,希望计算自上次服务日期以来每个项目的发票(匹配它自己的参数)。很明显,这里a.item = b.item。
我想你想要 row_number()
:
select s.*
from (select s.*, row_number() over (partition by item order by servdate desc) as seqnum
from service s
where s.servtype = 1
) s
where seqnum = 1;
如果我没听错,你可以join
,或者使用相关子查询:
select count(i.invno), i.item
from invoices i
where i.invdate > (
select max(s.servdate)
from services s
where s.servtype = 1 and s.item = i.item
)
group by i.item
如果您在 services(item, servtype)
上有索引,这应该是一种有效的方法。
或者,这里是 join
方法:
select count(i.invno), i.item
from invoices i
inner join (
select item, max(servdate) servdate
from services
where servtype = 1
group by item
) s on s.item = i.item and s.invdate > s.servdate
group by i.item
因为没有其他人展示我认为最好的方式,所以我会 post 它...
select count(i.invno), i.item
from invoices i
join (
select max(s.servdate) maxd, s.item
from services s
where s.servtype = 1
group by s.item
) as sub on sub.item = i.item and a.invdate > sub.maxd
group by i.item