首页 > 解决方案 > sql加入表,不提供完美的结果

问题描述

让我解释一下我需要什么,我有 2 个名为 A 和 B 的表。B 是 A 的子表。

这是架构:

------------------------
Table B:
itemId version qty  AId
44       1      1   200
44       1      2   201
44       2      2   200
------------------------
Table A:
id  tId
200 100
201 100
------------------------

这就是我需要的:我需要具有相同 tId 的所有最新版本数量的总和。

这是我的查询:

select sum(qty) as sum from B
left join A on A.id=B.AId
where itemId=44 and tId=100 and 
version=(select max(version) from B where itemId=44 and tId=100)

当一个项目获得版本 2 并且版本 1 被忽略时,结果会出错。

谢谢。

编辑:

我真正需要的是:

itemId version qty  AId
44       2      2   200
44       1      2   201

Sum(qty) 的结果必须为 4,因为它们具有相同的 tId,并且它们在每个 AId 中都有 Max 版本。

标签: sqlpostgresqltsql

解决方案


使用窗口函数。

select itemid, version, qty, aid
from (
  select *, max(version) over (partition by AId) as latestVersion 
  from B
) as B
where version = latestVersion

总结一下

select tId, SUM(qty) AS qty_sum
from (
  select *, max(version) over (partition by AId) as latestVersion 
  from B
) as B
join A on B.AId = A.id
where version = latestVersion
group by tId

推荐阅读