Mysql SQL和多组聚合
我需要编写一个MySQL查询,返回在最多三次交易中收到至少1000美元的收件人列表 以下是一个表格示例,第一列为收件人文本列,第二列对应于其交易金额int: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
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美元