在指定的时间间隔内选择总数大于指定值的记录

时间:2017-02-24 20:22:24

标签: sql select time sum running-total

这是支票兑现业务。

我有一张支票兑现表:

CustomerID, CustomerName, DateTimeCashed,      CheckAmount,  CheckFee, CheckPaypot    
00100       John Doe      01/01/2017 12:40:30      1000         20        980
00200       John Smith    01/02/2017 13:24:45      2000         40        1960
..................

有数以千计的记录。

我需要构建一个查询,该查询将返回所有记录,其中每个客户在任何24小时内兑现的总CheckPaypot超过10000.

如果将24小时间隔定义为从凌晨12:00到晚上11:59的一天,我知道如何执行此操作。

Select * from (
Select CustomerID, CustomerName, DateTimeCashed, CheckAmount, CheckFee, CheckPaypot,
(Select sum(ch.CheckPaypot) from Checks ch 
where 
ch.CustomerID = c.CustomerID and CONVERT(date, cn.DateTimeCashed) = CONVERT(date, c.DateTimeCashed)
) as Total from Checks c) x
where x.Total > 10000

但要求是时间间隔是浮动的意味着开始和结束可以是任何东西 只要时间间隔的长度是24小时。因此,客户兑现了3张支票:下午1点检查 在第二天中午之前进行2次检查,这些检查总数超过10000美元,所有检查都必须包含在结果中。

谢谢你, lenkost。

2 个答案:

答案 0 :(得分:1)

SELECT
   CustomerID,
   SUM(CheckPaypot) 
FROM
   tb_previsao 
WHERE
   DateTimeCashed > DateTimeCashed - INTERVAL '1' DAY 
GROUP BY
   CustomerID 
HAVING
   SUM(CheckPaypot) > 10000;

答案 1 :(得分:0)

不幸的是,您必须使用相关的子查询:

SELECT
  FROM (

SELECT outer_ch.*,
       (SELECT SUM(checkpayout)
          FROM checks inner_ch
         WHERE DATEDIFF(HOUR, inner_ch.datetimecashed, outer_ch.datetimecashed)
                 BETWEEN 0 AND 23
           AND inner_ch.customerid = outer_ch.customerid) AS running_sum_checkpayout
  FROM checks outer_ch

       )
 WHERE running_sum_checkpayout > 10000

我说“不幸”,因为相关子查询必然效率低,因为它们为结果集中的每一行执行单独的子查询。如果这不能很好地执行,请尽量避免对每个子查询执行全表扫描,例如在customerid上添加索引。