CREATE TABLE dbo.UpdateGaps( MachineID int NOT NULL, RecordedDate datetime NOT NULL, Pressure float NULL, CONSTRAINT PK_UpdateGaps PRIMARY KEY CLUSTERED (MachineID,RecordedDate))INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-02', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-03', 300);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-04', 300);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-05', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-06', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-07', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-08', 330);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-09', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-10', 300);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-02', 380);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-03', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-04', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-05', 350);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-06', 350);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-07', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-08', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-09', 400);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-10', 0);GO
MachineID RecordedDate Pressure--------- ------------ --------60 2012-10-02 0 <-- no change (nothing precedes this record)60 2012-10-03 300 <-- no change60 2012-10-04 300 <-- no change60 2012-10-05 0 <-- update to 30060 2012-10-06 0 <-- update to 30060 2012-10-07 0 <-- update to 30060 2012-10-08 330 <-- no change60 2012-10-09 0 <-- update to 33060 2012-10-10 300 <-- no change97 2012-10-02 380 <-- no change (new MachineID)97 2012-10-03 0 <-- update to 38097 2012-10-04 0 <-- update to 38097 2012-10-05 350 <-- no change97 2012-10-06 350 <-- no change97 2012-10-07 0 <-- update to 35097 2012-10-08 0 <-- update to 35097 2012-10-09 400 <-- no change97 2012-10-10 0 <-- update to 400
WITH C AS( SELECT MachineID, RecordedDate, Pressure, ROW_NUMBER() OVER(ORDER BY MachineID, RecordedDate) - ROW_NUMBER() OVER(ORDER BY Pressure,MachineID,RecordedDate) AS grp FROM dbo.UpdateGaps)SELECT MachineID, MIN(RecordedDate) AS mn, MAX(RecordedDate) AS mx, PressureFROM CGROUP BY MachineID, Pressure, grpORDER BY MachineID, mn;
DECLARE @MachineID INT = 0 ,@Pressure FLOAT = 0UPDATE u WITH(TABLOCKX)SET Pressure = CASE WHEN Pressure = 0 THEN @Pressure ELSE Pressure END ,@Pressure = CASE WHEN Pressure = 0 AND @MachineID = MachineID THEN @Pressure ELSE Pressure END ,@MachineID = MachineIDFROM dbo.UpdateGaps uOPTION(MAXDOP 1)
UPDATE ug SET Pressure = ca.Pressure FROM dbo.UpdateGaps ug CROSS APPLY (SELECT TOP 1 Pressure FROM dbo.UpdateGaps ugca WHERE ugca.MachineID = ug.MachineID AND ugca.RecordedDate <= ug.RecordedDate AND ugca.Pressure > 0 ORDER BY ugca.MachineID,ugca.RecordedDate DESC) ca;
; WITH R (MachineId, Pressure, RecordedDate, Rid) AS(SELECT MachineId, Pressure, RecordedDate, ROW_NUMBER() OVER(PARTITION BY MachineId ORDER BY MachineId, RecordedDate) AS Rid FROM dbo.UpdateGaps),GRPROW(MachineId, Pressure, RecordedDate, GroupId, RowId) AS(SELECT G1.MachineId, G1.Pressure, G1.RecordedDate, DENSE_RANK() OVER (PARTITION BY G1.MachineId ORDER BY G1.MachineId, ISNULL(MIN(G2.Rid) - 1, G1.Rid)) AS GroupId, ROW_NUMBER() OVER (PARTITION BY G1.MachineId, ISNULL(MIN(G2.Rid) - 1, G1.Rid) ORDER BY G1.MachineId, ISNULL(MIN(G2.Rid) - 1, G1.Rid), G1.RecordedDate DESC) AS RowId FROM R G1 LEFT JOIN R G2 ON (G1.MachineID = G2.MachineID AND G2.Rid > G1.Rid AND G1.Pressure <> G2.Pressure) GROUP BY G1.MachineId, G1.Pressure, G1.RecordedDate, G1.Rid)SELECT G1.MachineId, G1.Pressure, G1.RecordedDate, G1.GroupId, G1.RowId AS DescendingRowId, CASE WHEN ISNULL(G2.Pressure, 0) = 0 THEN G1.Pressure ELSE G2.Pressure END AS NewPressure FROM GRPROW G1 LEFT JOIN GRPROW G2 ON (G1.MachineId = G2.MachineId AND G1.GroupId - 1 = G2.GroupId AND G2.RowId = 1) ORDER BY G1.MachineId, G1.RecordedDate
CREATE TABLE dbo.UpdateGaps( MachineID int NOT NULL, RecordedDate datetime NOT NULL, Pressure float NULL, CONSTRAINT PK_UpdateGaps PRIMARY KEY CLUSTERED (MachineID,RecordedDate))INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-02', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-03', 300);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-04', 300);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-05', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-06', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-07', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-08', 330);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-09', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (60, '2012-10-10', 300);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-02', 380);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-03', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-04', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-05', 350);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-06', 350);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-07', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-08', 0);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-09', 400);INSERT dbo.UpdateGaps (MachineID, RecordedDate, Pressure) VALUES (97, '2012-10-10', 0);GOwith Base0Data as (select MachineID, RecordedDate, Pressure, rn = row_number() over (partition by MachineID, case when Pressure = 0 then 0 else 1 end order by RecordedDate)from dbo.UpdateGaps),BaseData as (select MachineID, RecordedDate, Pressure, GrpDate = dateadd(dd,-rn,RecordedDate), rn, rn1 = row_number() over (partition by MachineID, dateadd(dd,-rn,RecordedDate) order by dateadd(dd,-rn,RecordedDate))from Base0Data)--select * from BaseData where Pressure = 0select bd1.MachineID, bd1.RecordedDate, Pressure = case when bd1.Pressure = 0 then coalesce(bd2.Pressure, bd1.Pressure) else bd1.Pressure endfrom BaseData bd1 left outer join BaseData bd2 on (bd1.MachineID = bd2.MachineID and dateadd(dd, -bd1.rn1, bd1.RecordedDate) = bd2.RecordedDate)order by bd1.MachineID, bd1.RecordedDate;godrop table dbo.UpdateGaps;go