首页 > 解决方案 > SQL Server 总和查询每 06:30 AM

问题描述

真的需要一些帮助:我有一个这样的 SQL Server 表:

在此处输入图像描述

我想每天从今天 06:30 到明天 06:29 进行查询以计算价值。

问题是,该值并非从 0 开始,每 06:30。

我需要这样的查询:首先选择每个代码的最大值,例如:

(code : value)
M12 : 108, 
M77 : 26

那么 M77 值不是从 06:30 开始的。

我需要做:26 - 12(06:30:00 之前的值),所以 M77 现在是 14。

最后将 M77 和 M12 = 14 + 108 = 122 相加。

我的预期输出仅适用于每个日期的总价值。

根据我的数据库(图像),总值将为 26 - 12 = 14。

如何在 SQL Server 中做到这一点?请帮我

标签: sql-server

解决方案


试试这个谜题:

CREATE TABLE TestTable
(
[date]  datetime,
value   int,
code    varchar(10)
)
GO
INSERT INTO [dbo].[TestTable]
       ([date]
       ,[value]
       ,[code])
 VALUES
    ('2018-09-13 06:20:52.803'   
               ,100
               ,'M12'),
    ('2018-09-13 06:21:52.803'   
       ,102
       ,'M12')
    ,  ('2018-09-13 06:22:52.803'    
               ,104
               ,'M12')
    ,  ('2018-09-13 06:23:52.803'    
               ,106
               ,'M12')
    ,  ('2018-09-13 06:24:52.803'    
               ,108
               ,'M12')
    ,  ('2018-09-13 06:25:52.803'    
               ,2
               ,'M77')
    ,  ('2018-09-13 06:29:14.803'    
               ,4
               ,'M77')
    ,  ('2018-09-13 06:29:16.803'    
               ,6
               ,'M77')
    ,  ('2018-09-13 06:29:18.803'    
               ,8
               ,'M77')
    ,  ('2018-09-13 06:29:45.803'    
               ,10
               ,'M77')
    ,  ('2018-09-13 06:29:55.803'    
               ,12
               ,'M77')
    ,  ('2018-09-13 06:30:18.803'    
               ,14
               ,'M77')
    ,  ('2018-09-13 06:31:18.803'    
               ,26
               ,'M77')

;WITH RESULT AS (
SELECT 
  TT.code   
, MaxValueThatday          = max(maxval.MAXVALUE )              
, MaxValueBefore630NextDay = max(MAXValBefore630.MAXVALUE)
, ResultSubstraction = 
 CASE WHEN max(maxval.MAXVALUE ) <>  max(MAXValBefore630.MAXVALUE)
        THEN max(maxval.MAXVALUE )  - max(MAXValBefore630.MAXVALUE)
    ELSE max(maxval.MAXVALUE ) 
END
FROM  [dbo].[TestTable] TT
 OUTER APPLY(   
            SELECT max(VALUE) MAXVALUE
                , code 
             FROM [dbo].[TestTable] aa
                WHERE Aa.code = tt.code
            group by code
        )maxval
 OUTER APPLY(   
            SELECT max(A.VALUE) MAXVALUE
                , code
             FROM [dbo].[TestTable] A
                 WHERE DATEPART(HOUR,[DATE]) <= 6 AND DATEPART(MINUTE,[DATE]) < 30 
                 and A.code = tt.code
            group by code
        )MAXValBefore630
where    ( [DATE] > DATEADD(MINUTE,390,CAST({ fn CURDATE()} AS DATETIME) ) ) --6:30 today
group by tt.code

)
SELECT SUM(ResultSubstraction)
 FROM RESULT

推荐阅读