使用LAG嘗試是這樣的。還有其他方法,但這應該很容易。
編輯:更改樣本數據以包括所需的月份範圍之外的記錄。還簡化了閱讀以便於手動計算。威爾將顯示OP所簽署的第二個選項。
DECLARE @tbl TABLE (stamp DATETIME, Reading INT)
INSERT INTO @tbl VALUES
('02/28/2014',0)
,('03/01/2014',10)
,('03/10/2014',20)
,('03/22/2014',0)
,('03/30/2014',10)
,('03/31/2014',20)
,('04/01/2014',30)
--Original solution with WHERE on the "outer" SELECT.
--This give a result of 40 as it include the change of 10 between 2/28 and 3/31.
;WITH cte AS (
SELECT Reading
,LAG(Reading,1,Reading) OVER (ORDER BY stamp ASC) LastReading
,Reading - LAG(Reading,1,Reading) OVER (ORDER BY stamp ASC) ChangeSinceLastReading
,CONVERT(date, stamp) stamp
FROM @tbl
)
SELECT SUM(CASE WHEN Reading = 0 THEN 0 ELSE ChangeSinceLastReading END)
FROM cte
WHERE stamp BETWEEN '03/01/2014' AND '03/31/2014'
--Second option with WHERE on the "inner" SELECT (within the CTE)
--This give a result of 30 as it include the change of 10 between 2/28 and 3/31 is by the filtered lag.
;WITH cte AS (
SELECT Reading
,LAG(Reading,1,Reading) OVER (ORDER BY stamp ASC) LastReading
,Reading - LAG(Reading,1,Reading) OVER (ORDER BY stamp ASC) ChangeSinceLastReading
,CONVERT(date, stamp) stamp
FROM @tbl
WHERE stamp BETWEEN '03/01/2014' AND '03/31/2014'
)
SELECT SUM(CASE WHEN Reading = 0 THEN 0 ELSE ChangeSinceLastReading END)
FROM cte
請出示相關的架構和數據的序列是有問題的,所以我們有一個更好的。 –
它是哪個數據庫系統? – Szymon
在您的示例數據中,如果日期分別爲3/1,3/10,3/20和3/31將覆蓋3月份,並且您希望獲得一筆用於重置的金額,對不對? Sum =(37240-37210)+(220-0)? –