我沒有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
沒有與數據庫無關的方式來處理分箱時間戳。 –