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

Sql 在指定的时间间隔内选择总值大于指定值的记录,sql,select,time,sum,cumulative-sum,Sql,Select,Time,Sum,Cumulative Sum,这是支票兑现业务 我有一张兑换支票的表格: 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

这是支票兑现业务

我有一张兑换支票的表格:

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小时内兑现的支票总额超过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。

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

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

上放置索引,用您正在使用的数据库标记您的问题。每一行是否有唯一的id?此查询将返回每个客户的所有行在过去24小时内的运行总数。我只需要返回24小时范围内的周围事务总数超过10000美元的行。“周边交易”的意思是区块中第一笔和最后一笔交易之间的时间距离小于24小时。换句话说,如果该记录是24小时区块的一部分,其总额超过10000美元,则必须将其包括在结果中。谢谢你,lenkost。正如原始答案中所述,你需要
查询的输出
中选择运行\u sum\u checkpayout>10000
以获得你想要的结果。我修改了答案,将其包括在内。
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