对不同行组合的SQL查询

时间:2016-10-26 23:51:53

标签: sql relational-database

我有一张桌子,比如说Table1以下结构:

name varchar(20), 
amount integer

带有自动生成的ID字段。以上两个字段都不能为空,但可以重复 - 不一定是唯一的。

我应该查询name的列表,以便对于列表中的每个名称,必须满足以下条件:

  

amount = 3的情况下,给定名称的最多k个字段k的总和必须超过1000。

因此,例如,名称Smith出现在一行中的金额仅为1005,这是此查询的结果。琼斯出现4次,每次金额为200的名称将不会在此查询中返回,但如果其中一个金额为700,则可能会返回。

怎么做?我可以想到的是在name字段上将表自身连接两次,其中条件是结果表中的3个量的总和> = 1000并且行ID是不同的。 但是,必须有一个更好的方法。这个逻辑会失败k本来是一个很高的数字,比如100。

1 个答案:

答案 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字段的比较是为了防止单行对组合贡献多次。