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