我有一张桌子,比如说Table1
以下结构:
name varchar(20),
amount integer
带有自动生成的ID字段。以上两个字段都不能为空,但可以重复 - 不一定是唯一的。
我应该查询name
的列表,以便对于列表中的每个名称,必须满足以下条件:
在
amount
= 3的情况下,给定名称的最多k
个字段k
的总和必须超过1000。
因此,例如,名称Smith出现在一行中的金额仅为1005,这是此查询的结果。琼斯出现4次,每次金额为200的名称将不会在此查询中返回,但如果其中一个金额为700,则可能会返回。
怎么做?我可以想到的是在name
字段上将表自身连接两次,其中条件是结果表中的3个量的总和> = 1000并且行ID是不同的。
但是,必须有一个更好的方法。这个逻辑会失败k
本来是一个很高的数字,比如100。
答案 0 :(得分:1)
我认为有两个联接:
select distinct t1.name
from table1 t1 left join
table1 t2
on t1.name = t2.name and t1.id < t2.id left join
table1 t3
on t2.name = t3.name and t2.id < t3.id
where coalesce(t1.amount, 0) + coalesce(t2.amount, 0) + coalesce(t3.amount, 0) >= 1000;
这些是left join
,因此您可以找到少于3行的组合。
distinct
是因为单个名称可能包含多个此类组合。
id
字段的比较是为了防止单行对组合贡献多次。