Mysql SQL和多组聚合

Mysql SQL和多组聚合,mysql,sql,Mysql,Sql,我需要编写一个MySQL查询,返回在最多三次交易中收到至少1000美元的收件人列表 以下是一个表格示例,第一列为收件人文本列,第二列对应于其交易金额int: recipient amount 1 200 1 10000 2 100 2 10 3 500 4 400 4 400 4 200 3 200 3 100

我需要编写一个MySQL查询,返回在最多三次交易中收到至少1000美元的收件人列表

以下是一个表格示例,第一列为收件人文本列,第二列对应于其交易金额int:

recipient  amount 
1          200
1          10000
2          100
2          10
3          500
4          400
4          400
4          200
3          200
3          100
我了解如何做到这一点:

select user
from t
group by user
having count(*) <= 3 and
       sum(amount) >= 1000;
但在下一个注释中给出的任务中:请注意,收件人可以有三笔以上的交易,只要三笔或更少的交易至少达到1000美元


我完全被卡住了,在网上找不到答案。

这是解决问题的方法之一。首先选择不超过3个条目的收件人,然后仅在该收件人集中筛选总和:

SELECT recipient 
FROM usr GROUP BY recipient 
HAVING recipient IN 
    (SELECT recipient AS c FROM usr GROUP BY recipient HAVING COUNT(*) <= 3)  AND 
    sum(amount) >= 1000

这是做这件事的方法之一。首先选择不超过3个条目的收件人,然后仅在该收件人集中筛选总和:

SELECT recipient 
FROM usr GROUP BY recipient 
HAVING recipient IN 
    (SELECT recipient AS c FROM usr GROUP BY recipient HAVING COUNT(*) <= 3)  AND 
    sum(amount) >= 1000

假设性能不是您主要关心的问题,这应该会起作用,并且还会显示有3个以上交易但前3名金额超过1000的收件人:

select distinct t1.recipient
from 
  (select recipient,amount from t order by amount desc) t1 
left join
  (select recipient,amount from t order by amount desc) t2
on t1.recipient = t2.recipient and t2.amount < t1.amount 

left join
  (select recipient,amount from t order by amount desc) t3
     on t1.recipient = t3.recipient and t3.amount < t2.amount

where 
  t1.amount + coalesce(t2.amount, 0) + coalesce(t3.amount, 0) >= 1000;
在对这个问题进行了更多的思考之后,您实际上需要一个单独的、独特的专栏,以便在100%的时间内完成这项工作。正如您可以清楚地检查的那样,这里没有显示收件人4。
我们可以通过使用另一个id列并将金额值与进行比较来纠正这一事实,假设性能不是您主要关心的问题,这应该会起作用,并且还会显示有3笔以上交易但前3笔金额超过1000的收件人:

select distinct t1.recipient
from 
  (select recipient,amount from t order by amount desc) t1 
left join
  (select recipient,amount from t order by amount desc) t2
on t1.recipient = t2.recipient and t2.amount < t1.amount 

left join
  (select recipient,amount from t order by amount desc) t3
     on t1.recipient = t3.recipient and t3.amount < t2.amount

where 
  t1.amount + coalesce(t2.amount, 0) + coalesce(t3.amount, 0) >= 1000;
在对这个问题进行了更多的思考之后,您实际上需要一个单独的、独特的专栏,以便在100%的时间内完成这项工作。正如您可以清楚地检查的那样,这里没有显示收件人4。
我们可以通过使用另一个id列并将amount值与哪个版本的mySQL进行比较来纠正这一事实?窗口/分析功能可用吗?@xQbert我在一个网站上尝试在线解决这项任务。我不确定窗口/分析功能。你可以将金额限制为每个收件人的前三名,然后求和,如果前三名合计不到1000,那么你知道没有人会;不管有多少。基本上用一个派生表替换上面的t,该表只包含每个收件人的前3个金额。mySQL的哪个版本?窗口/分析功能可用吗?@xQbert我在一个网站上尝试在线解决这项任务。我不确定窗口/分析功能。你可以将金额限制为每个收件人的前三名,然后求和,如果前三名合计不到1000,那么你知道没有人会;不管有多少。基本上,将上面的t替换为只包含每个收件人的前3个金额的派生表。如果我正确理解任务,则收件人可以有3个以上的事务,并且仍然在结果集中,如果他达到1000,其中最多有3个。返回在最多三次交易中收到至少1000美元的收件人列表,我理解我们忽略了超过3个条目的收件人。在其余的部分中,我们希望总量超过1000。如果这不是预期的结果,那么我的答案就不相关了。问题的作者应该澄清。我指的是问题的最后一部分,但在下一个注释中给出的任务中:请注意,该收件人可以有三笔以上的交易,只要我正确理解任务,三笔或三笔以下的交易至少达到1000美元,然后,一个收件人可以有3笔以上的交易,如果他达到1000笔,并且最多有3笔交易,那么他仍然可以在结果集中。返回在最多3笔交易中至少收到1000美元的收件人列表我理解我们忽略了那些有3笔以上交易的收件人。在其余的部分中,我们希望总量超过1000。如果这不是预期的结果,那么我的答案就不相关了。问题的作者应该澄清。我指的是问题的最后一部分,但在下一个注释中给出的任务中:请注意,该收件人可以有三笔以上的交易,只要三笔或更少的交易至少达到1000美元