MySQL如何在任何15分钟的时间窗口内计算多余事务的总量?

MySQL如何在任何15分钟的时间窗口内计算多余事务的总量?,mysql,sql,group-by,inner-join,self-join,Mysql,Sql,Group By,Inner Join,Self Join,MySQL 在同一商户的任何15分钟窗口内,哪些卡已使用3次以上的报告: create table tran( id int, tran_dt datetime, card_id int, merchant_id int, amount int ); #Customer #1 insert into tran values(11, '2015-01-01 01:59:00', 1, 1, 2); insert into tran values(12, '2015-01-

MySQL

在同一商户的任何15分钟窗口内,哪些卡已使用3次以上的报告:

create table tran(
  id int,
  tran_dt datetime, 
  card_id int,
  merchant_id int,
  amount int
);

#Customer #1 
insert into tran values(11, '2015-01-01 01:59:00', 1, 1, 2);
insert into tran values(12, '2015-01-01 02:01:00', 1, 1, 4);
insert into tran values(13, '2015-01-01 02:02:00', 1, 1, 6);

#Customer #2 
insert into tran values(21, '2015-01-01 01:00:00', 2, 1, 10);
insert into tran values(22, '2015-01-01 01:01:00', 2, 1, 20);
insert into tran values(23, '2015-01-01 01:02:00', 2, 1, 30);
insert into tran values(24, '2015-01-01 01:03:00', 2, 1, 20);
insert into tran values(29, '2015-01-02 01:03:00', 2, 1, 10);

#Customer #3 
insert into tran values(31, '2015-01-01 01:00:00', 3, 1, 100);
insert into tran values(32, '2015-01-01 01:00:00', 3, 1, 200);
insert into tran values(33, '2015-01-01 01:00:00', 3, 1, 100);
insert into tran values(34, '2015-01-01 01:00:00', 3, 1, 200);
insert into tran values(35, '2015-01-01 01:00:00', 3, 1, 100);
这个查询现在可以很好地计算卡片数量

最后,我尝试添加一个名为SumAmount的列,以给出金额的总和。但是SumAmount显示错误的对数大数值,因为它是一个自联接。我想我只需要在不同的行ID上求和,就像Count列一样。如何确定金额


您的查询有点不正确,因为它缺少事务id。但是,您真正的问题是您希望从t2而不是t1求和金额:


注意:我将连接条件从>更改为>=以包括第一个事务。另外,我在日期添加了>=,并将SELECT中的计数更改为第二个表的计数,而不是第一个表的计数。

您的查询有点不正确,因为它缺少事务id。但是,您真正的问题是要从t2而不是t1求和金额:

SELECT t1.card_id, t1.merchant_id, t1.tran_dt,
       count(distinct t2.id) + 1 as Count, sum(t2.amount) as SumAmount
FROM tran t1 INNER JOIN
     tran t2
     on t2.card_id = t1.card_id and
        t2.merchant_id = t1.merchant_id and
        t2.tran_dt >= t1.tran_dt and
        t2.tran_dt <= DATE_ADD(t1.tran_dt, INTERVAL 15 MINUTE) 
GROUP BY t1.id, t1.card_id, t1.merchant_id, t1.tran_dt
HAVING Count > 2;

注意:我将连接条件从>更改为>=以包括第一个事务。另外,我在日期上添加了>=,并将SELECT中的计数更改为第二个表的计数,而不是第一个。

在grp中将trans_dt的打字错误修复为tran_dt后,返回了太多行by@DrewPierce . . . 对于客户3,您将获得每笔交易的一行。这是从今天早些时候开始的。。。OP希望在“金额”列中添加一个总和。没有时间做任何事情,只是想给你反馈。@DrewPierce。此查询将在15分钟内返回具有两个以上事务的每个事务以及总和。当15分钟内有超过3笔交易时,这将涉及重复交易。我不清楚是否真的需要解决结果中的重复问题查询中的问题是部分顺序逻辑使用trans_dt,另一部分使用id;只应使用日期。您是在哪里执行此操作的:我将连接条件从>更改为>=?在grp中将trans_dt上的拼写错误修复为tran_dt后,返回了太多行by@DrewPierce . . . 对于客户3,您将获得每笔交易的一行。这是从今天早些时候开始的。。。OP希望在“金额”列中添加一个总和。没有时间做任何事情,只是想给你反馈。@DrewPierce。此查询将在15分钟内返回具有两个以上事务的每个事务以及总和。当15分钟内有超过3笔交易时,这将涉及重复交易。我不清楚是否真的需要解决结果中的重复问题查询中的问题是部分顺序逻辑使用trans_dt,另一部分使用id;只应使用日期。您在哪里执行此操作:我将连接条件从>更改为>=?
SELECT t1.card_id, t1.merchant_id, t1.tran_dt,
       count(distinct t2.id) + 1 as Count, sum(t2.amount) as SumAmount
FROM tran t1 INNER JOIN
     tran t2
     on t2.card_id = t1.card_id and
        t2.merchant_id = t1.merchant_id and
        t2.tran_dt >= t1.tran_dt and
        t2.tran_dt <= DATE_ADD(t1.tran_dt, INTERVAL 15 MINUTE) 
GROUP BY t1.id, t1.card_id, t1.merchant_id, t1.tran_dt
HAVING Count > 2;
SELECT a.card_id, a.merchant_id, MAX(cases_count) AS cases_count, MAX(sum_of_amount) AS sum_of_amount
FROM
(
SELECT t1.id, t1.card_id,t1.merchant_id, count(*) AS cases_count, sum(t2.amount) AS sum_of_amount
FROM tran t1 
INNER JOIN tran t2
ON t2.card_id=t1.card_id 
AND t2.merchant_id=t1.merchant_id 
AND (t2.tran_dt <= DATE_ADD(t1.tran_dt, INTERVAL 15 MINUTE)
AND t2.tran_dt >= t1.tran_dt )
GROUP BY t1.id, t1.card_id,t1.merchant_id
HAVING COUNT(*) > 2
) AS a
GROUP BY a.card_id, a.merchant_id