Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不同行组合上的SQL查询_Sql_Relational Database - Fatal编程技术网

不同行组合上的SQL查询

不同行组合上的SQL查询,sql,relational-database,Sql,Relational Database,我有一个表,比如说表1的结构如下: name varchar(20), amount integer 具有自动生成的ID字段。以上两个字段都不能为空,但可以重复-不一定是唯一的 我应该查询名称列表,以便对于列表中的每个名称,必须满足以下条件: 给定名称最多k个字段的总数必须超过1000,其中k=3 因此,例如,仅在一行中显示金额为1005的名称Smith就是此查询的结果。琼斯的名字出现了4次,每次的金额为200,在这个查询中不会被返回,但是如果他的其中一个金额为700,就会被返回 如何做到这

我有一个表,比如说表1的结构如下:

name varchar(20), 
amount integer
具有自动生成的ID字段。以上两个字段都不能为空,但可以重复-不一定是唯一的

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

给定名称最多k个字段的总数必须超过1000,其中k=3

因此,例如,仅在一行中显示金额为1005的名称Smith就是此查询的结果。琼斯的名字出现了4次,每次的金额为200,在这个查询中不会被返回,但是如果他的其中一个金额为700,就会被返回

如何做到这一点?我能想到的一个方法是在名称字段上两次将表与自身内部连接,其中条件是结果表中3个金额的总和>=1000,并且行ID是不同的。
但是,一定有更好的办法。如果k是一个很高的数字,比如说100,那么这个逻辑就会失败

我认为需要两个连接:

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;
这些是左连接,因此您可以找到少于3行的组合

区别在于单个名称可能有多个这样的组合


id字段上的比较是为了防止一行对组合的贡献超过一次。

@user6762070。如何做到这一点?问题很清楚。如果你不想得到这样的答案,你应该把它包括在你的问题中。@user6762070。。那太粗鲁了。你问了一个问题,在答案上发表这样的评论是不公平的。