How to update last record with second lat results [SQLServer]
I'm not sure I'm following. Given data like this:
TestergebnisID TestaufstellungID Pass Fail
-------------- ----------------- ----------- -----------
1 1 10 12
2 1 5 6
3 1 3 4
4 2 0 0
You want to update the row with TestergebnisID = 3 with Pass and Fail from record with TestergebnisID = 2 and that's it? Or should record 2 be updated with data from record 1 too?
In case of the former, this should do the trick:
;WITH rec AS
(
SELECT this.TestaufstellungID
-- most recent for the given test run
, MAX(this.TestergebnisID) AS LastTestergebnisID
-- find the previous
, PrevTestergebnisID =
(SELECT MAX(prev.TestergebnisID)
FROM Testergebnisse prev
WHERE prev.TestaufstellungID = this.TestaufstellungID
AND prev.TestergebnisID < MAX(this.TestergebnisID )
)
FROM Testergebnisse this
GROUP BY this.TestaufstellungID
)
UPDATE mostRecent
SET Pass = prev.Pass
, Fail = prev.Fail
FROM Testergebnisse mostRecent
JOIN rec
ON rec.LastTestergebnisID = mostRecent.TestergebnisID
JOIN Testergebnisse prev
ON prev.TestergebnisID = rec.PrevTestergebnisID
Gives:
TestergebnisID TestaufstellungID Pass Fail
-------------- ----------------- ----------- -----------
1 1 10 12
2 1 5 6
3 1 5 6 <-- 1 row affected
4 2 0 0
If you want all of them to be updated with their predecessors' values, then:
;WITH rec AS
(
SELECT this.TestaufstellungID
-- most recent for the given test run
, this.TestergebnisID
-- find the previous
, PrevTestergebnisID =
(SELECT MAX(prev.TestergebnisID)
FROM Testergebnisse prev
WHERE prev.TestaufstellungID = this.TestaufstellungID
AND prev.TestergebnisID < this.TestergebnisID
)
FROM Testergebnisse this
)
UPDATE mostRecent
SET Pass = prev.Pass
, Fail = prev.Fail
FROM Testergebnisse mostRecent
JOIN rec
ON rec.TestergebnisID = mostRecent.TestergebnisID
JOIN Testergebnisse prev
ON prev.TestergebnisID = rec.PrevTestergebnisID
This will update rows 2 (from 1) & 3 (from 2):
TestergebnisID TestaufstellungID Pass Fail
-------------- ----------------- ----------- -----------
1 1 10 12
2 1 10 12 <--
3 1 5 6 <--
4 2 0 0