我没有sol首次请求。 (总计每个“Timeslot”类型的查询) 但我确实有第二个请求。 (每个“Timeslot”的累积运行总数)
AS Gordon在SQL Server 2012中提到,这非常简单。 但是,我提供了一个可以在SQL 2005之后完成的旧方法。
此外,解决方案并非100%与数据库无关,但更容易从SQL-SERVER转换为ORACLE或DB2或其他任何东西。
在进行实际查询之前,请查看我创建的函数,以便在给出两个日期范围时给我一个TimeSlot值。 UFN to GET TIMESLOT Values
请注意,该功能是按插槽类型在不同粒度级别创建的。小时,分钟,秒等....你可以创建新的,只要你喜欢。
在下面的示例查询中,我选择了11秒的时隙。
检查结果在这里。 Sample Output
DECLARE @dt TABLE
(
RowID INT IDENTITY NOT NULL
,LastModified DATETIME2(2) NOT NULL
,Amount INT NOT NULL DEFAULT 0
)
INSERT INTO @dt(LastModified, Amount)
SELECT '2014-03-04 00:00:00.00', 10
UNION ALL SELECT '2014-03-04 00:00:05.00', 10
UNION ALL SELECT '2014-03-04 00:00:10.00', 10
UNION ALL SELECT '2014-03-04 00:00:15.00', 10
UNION ALL SELECT '2014-03-04 00:00:20.00', 10
UNION ALL SELECT '2014-03-04 00:00:25.00', 10
UNION ALL SELECT '2014-03-04 00:00:30.00', 10
UNION ALL SELECT '2014-03-04 00:00:35.00', 10
UNION ALL SELECT '2014-03-04 00:00:40.00', 10
UNION ALL SELECT '2014-03-04 00:00:45.00', 10
UNION ALL SELECT '2014-03-04 00:00:50.00', 10
DECLARE @DatePart sysname
,@SlotValue INT
,@MinDt DATETIME2(2)
,@MaxDt DATETIME2(2)
SET @SlotValue = 11
SELECT @MinDt=MIN(LastModified)
,@MaxDt=MAX(LastModified)
FROM @dt
;WITH AllDt(RowID,timeslot,amount)
AS
(
SELECT CAST (ROW_NUMBER() OVER (ORDER BY COALESCE(t1.TimeSlot,t2.LastModified)) AS INT) RowID
,COALESCE(t1.TimeSlot,t2.LastModified)
,ISNULL(t2.Amount,0) AS Amount
FROM dbo.ufn_utl_timeslotBySecond(@SlotValue,@MinDt,@MaxDt) t1
FULL OUTER JOIN @dt t2
ON t1.TimeSlot=t2.LastModified
)
,
RCTE1(RowID,timeslot,amount)
AS
(
SELECT RowID
,timeslot
,Amount
FROM AllDt
WHERE RowID=1
UNION ALL
SELECT dt.RowID,dt.TimeSlot,CAST(dt.Amount+t3.amount AS INT) AS amount
FROM ALLDt dt
JOIN RCTE1 t3
ON dt.RowID=t3.RowID+1
)
SELECT *
FROM RCTE1
ORDER BY TimeSlot
没有与数据库无关的方式来处理分箱时间戳。 –