每隔06:30 SQL Server查询计数值

请帮我。 我的数据和查询有问题。 请先看看我的桌面设计。

CREATE TABLE [dbo].[my_table]( [ID] [int] NOT NULL, [date] [datetime] NULL, [value] [int] NULL, [product_code] [varchar](50) NULL, [expectedvalue] [int] NULL, CONSTRAINT [PK_my_table] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO 

这是数据,所有数据都是在每分钟从机器获得的。

数据场景1(06:30的值不为0):

 INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521798, CAST(0x0000A97C006A9B06 AS DateTime), 1164, N'17NPPN_M838', 1164) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521799, CAST(0x0000A97C006AE1D4 AS DateTime), 1164, N'17NPPN_M838', 1164) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521800, CAST(0x0000A97C006B2894 AS DateTime), 1172, N'17NPPN_M838', 8) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521801, CAST(0x0000A97C006B6E38 AS DateTime), 1172, N'17NPPN_M838', 8) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521802, CAST(0x0000A97C006BB501 AS DateTime), 1172, N'17NPPN_M838', 8) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521803, CAST(0x0000A97C006BFA9F AS DateTime), 1172, N'17NPPN_M838', 8) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521804, CAST(0x0000A97C006C4167 AS DateTime), 1181, N'17NPPN_M838', 17) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521805, CAST(0x0000A97C006C882E AS DateTime), 1193, N'17NPPN_M838', 29) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521806, CAST(0x0000A97C006CCDCC AS DateTime), 1202, N'17NPPN_M838', 38) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521807, CAST(0x0000A97C006D1493 AS DateTime), 1210, N'17NPPN_M838', 46) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521808, CAST(0x0000A97C006D5A31 AS DateTime), 1220, N'17NPPN_M838', 56) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521809, CAST(0x0000A97C006DA0F9 AS DateTime), 1226, N'17NPPN_M838', 62) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521810, CAST(0x0000A97C006DE7C0 AS DateTime), 1237, N'17NPPN_M838', 73) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521811, CAST(0x0000A97C006E2D5F AS DateTime), 1248, N'17NPPN_M838', 84) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521812, CAST(0x0000A97C006E7427 AS DateTime), 1253, N'17NPPN_M838', 89) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521813, CAST(0x0000A97C006EB9C5 AS DateTime), 1264, N'17NPPN_M838', 100) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521814, CAST(0x0000A97C006F008C AS DateTime), 1276, N'17NPPN_M838', 112) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521815, CAST(0x0000A97C006F4753 AS DateTime), 1286, N'17NPPN_M838', 122) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521816, CAST(0x0000A97C006F8CF2 AS DateTime), 1293, N'17NPPN_M838', 129) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521817, CAST(0x0000A97C006FD3B8 AS DateTime), 1305, N'17NPPN_M838', 141) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521818, CAST(0x0000A97C00701957 AS DateTime), 1317, N'17NPPN_M838', 153) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521819, CAST(0x0000A97C00706025 AS DateTime), 1327, N'17NPPN_M838', 163) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521820, CAST(0x0000A97C0070A6E6 AS DateTime), 1336, N'17NPPN_M838', 172) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521821, CAST(0x0000A97C0070EC85 AS DateTime), 1348, N'17NPPN_M838', 184) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521822, CAST(0x0000A97C0071334C AS DateTime), 1360, N'17NPPN_M838', 196) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521823, CAST(0x0000A97C007178F0 AS DateTime), 1371, N'17NPPN_M838', 207) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521824, CAST(0x0000A97C0071BFB2 AS DateTime), 0, N'17LPPL_M848', 207) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521825, CAST(0x0000A97C0072067F AS DateTime), 0, N'17LPPL_M848', 207) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521826, CAST(0x0000A97C00724C16 AS DateTime), 0, N'17LPPL_M848', 207) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521827, CAST(0x0000A97C007292DE AS DateTime), 12, N'17LPPL_M848', 219) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521828, CAST(0x0000A97C0072D87C AS DateTime), 21, N'17LPPL_M848', 228) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521829, CAST(0x0000A97C00731F44 AS DateTime), 30, N'17LPPL_M848', 237) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521830, CAST(0x0000A97C0073660B AS DateTime), 42, N'17LPPL_M848', 249) INSERT [dbo].[my_table] ([ID], [date], [value], [product_code], [expectedvalue]) VALUES (1521831, CAST(0x0000A97C0073ABA8 AS DateTime), 50, N'17LPPL_M848', 257) 

数据场景2(06:30的值为0):

 INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521798, CAST(0x0000A97C006A9B06 AS DateTime), 1164, N'17NPPN_M838') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521799, CAST(0x0000A97C006AE1D4 AS DateTime), 1164, N'17NPPN_M838') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521800, CAST(0x0000A97C006B2894 AS DateTime), 0, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521801, CAST(0x0000A97C006B6E38 AS DateTime), 0, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521802, CAST(0x0000A97C006BB501 AS DateTime), 0, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521803, CAST(0x0000A97C006BFA9F AS DateTime), 12, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521804, CAST(0x0000A97C006C4167 AS DateTime), 32, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521805, CAST(0x0000A97C006C882E AS DateTime), 43, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521806, CAST(0x0000A97C006CCDCC AS DateTime), 54, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521807, CAST(0x0000A97C006D1493 AS DateTime), 54, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521808, CAST(0x0000A97C006D5A31 AS DateTime), 65, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521809, CAST(0x0000A97C006DA0F9 AS DateTime), 67, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521810, CAST(0x0000A97C006DE7C0 AS DateTime), 76, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521811, CAST(0x0000A97C006E2D5F AS DateTime), 97, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521812, CAST(0x0000A97C006E7427 AS DateTime), 104, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521813, CAST(0x0000A97C006EB9C5 AS DateTime), 108, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521814, CAST(0x0000A97C006F008C AS DateTime), 204, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521815, CAST(0x0000A97C006F4753 AS DateTime), 224, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521816, CAST(0x0000A97C006F8CF2 AS DateTime), 245, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521817, CAST(0x0000A97C006FD3B8 AS DateTime), 267, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521818, CAST(0x0000A97C00701957 AS DateTime), 289, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521819, CAST(0x0000A97C00706025 AS DateTime), 290, N'17LPPL_M848') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521820, CAST(0x0000A97C0070A6E6 AS DateTime), 0, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521821, CAST(0x0000A97C0070EC85 AS DateTime), 0, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521822, CAST(0x0000A97C0071334C AS DateTime), 0, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521823, CAST(0x0000A97C007178F0 AS DateTime), 0, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521824, CAST(0x0000A97C0071BFB2 AS DateTime), 5, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521825, CAST(0x0000A97C0072067F AS DateTime), 8, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521826, CAST(0x0000A97C00724C16 AS DateTime), 18, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521827, CAST(0x0000A97C007292DE AS DateTime), 25, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521828, CAST(0x0000A97C0072D87C AS DateTime), 36, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521829, CAST(0x0000A97C00731F44 AS DateTime), 46, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521830, CAST(0x0000A97C0073660B AS DateTime), 54, N'17LPPL_D220') INSERT [dbo].[my_table] ([ID], [date], [value], [product_code]) VALUES (1521831, CAST(0x0000A97C0073ABA8 AS DateTime), 66, N'17LPPL_D220') 

我想从今天06:30到明天06:29每分钟计算一次价值。 因为我需要从中制作图表。

这是我目前的查询:

 ;WITH RESULT AS (SELECT TT.productcode , 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].my_table TT OUTER APPLY( SELECT max(value) MAXVALUE , product_code FROM [dbo].my_table aa WHERE Aa.productcode = tt.productcode group by productcode )maxval OUTER APPLY( SELECT max(A.value) MAXVALUE , productcode FROM [dbo].my_table A WHERE DATEPART(HOUR,date) <= 6 AND DATEPART(MINUTE,date)  DATEADD(MINUTE,390,CAST({ fn CURDATE()} AS DATETIME) ) ) --6:30 today group by tt.productcode ) SELECT SUM(ResultSubstraction) FROM RESULT 

那么,如何计算每分钟的总价值从今天06:30开始到明天06:29?

重要的说明是:

  1. 该值应从06:30开始计算。

  2. 如果在06:30该值为0,则不需要将值与前一行(值)相加,只需将当前值包含在expectedvalue列中。

  3. 如果在06:30该值不为0,那么我们需要在当前行(06:30)中进行值 – 值当前行-1(06:29)。 结果应包含在expectedvalue列中。 然后我们需要使用公式在每一行中对它们求和:(当前值 – 当前值-1)+当前预期值。
  4. 如果当前值(当前行)与前一行相同,则无需对它们求和。 只需使用当前的期望值。

我的解释清楚了吗?

我希望你们所有人都明白我的意思,并希望帮助我解决问题。

非常感谢你的帮助。

初步答案:

只需使用CROSS APPLY并对value执行SUM

 SELECT ID, DATE, VALUE, VALUEEXPECTED FROM [dbo].my_table TT CROSS APPLY ( SELECT SUM (VALUE) AS VALUEEXPECTED FROM [dbo].my_table AS X WHERE X.ID <= TT.ID AND X.DATE > DATEADD(MINUTE,390,CAST({ fn CURDATE()} AS DATETIME) ) ) ) AS VE 

新答案:

对于问题的更改,计算预期值的新方法。

 select t.*, expectedvalue = t.value - isnull(s.value, 0), -- the following 3 value are included for your reference on how the query works r.ref_date, s.date, s.value from my_table t cross apply ( -- calculate the reference 06:30 date & time for each date select ref_date = dateadd(day, datediff(day, 0, dateadd(minute, -390, t.[date])), '06:30') ) r outer apply ( -- get the last value before 06:30 ref date select top 1 x.date, value = x.value from my_table x where x.id < t.id and x.[date] < r.ref_date order by x.date desc ) s