2016-06-29 8 views
0

Ich habe ein CTE, die wie folgt aussieht:Update alle außer den letzten zwei?

;with cte as 
( 
    SELECT WeekNum 
    FROM MonitorTable 
    GROUP BY WeekNum 
    HAVING SUM(CASE WHEN IsProcessed = 1 THEN 1 
       ELSE 0 
      END) = 8 
    order by WeekNum 
) 
update MonitorTable 
set ReadToGrid = 0 
where WeekNum in (select WeekNum from cte) 

Das hier Problem ist, dass es alles ist zu aktualisieren. Da immer zwei übrig bleiben müssen, kann ich nur den letzten updaten.

Also lassen Sie uns sagen, dass CTE gibt die folgende:

1 
2 
3 
4 
5 
6 

ich nicht alles aktualisieren; müsste alles außer den letzten zwei (1, 2, 3, 4) aktualisieren.

Also, wie kann ich das Skript so ändern, dass es alles außer den letzten zwei Zeilen aktualisiert?

Danke.

+0

Änderung der 'where' Zustand' wo WEEKNUM in (wählen WEEKNUM-2 von CTE) '? –

+0

Vielleicht 'WHERE WeekNum <= (SELECT MAX (WocheNum) -2 FROM cte)' – BJones

Antwort

1

Ohne Daten Ich kann nicht die genaue Syntax testen, aber die Idee funktioniert:

Select WeekNum, Row_Number() Over (Order By WeekNum Desc) RowNum 
From 
(
SELECT WeekNum 
    FROM MonitorTable 
    GROUP BY WeekNum 
    HAVING SUM(CASE WHEN IsProcessed = 1 THEN 1 
       ELSE 0 
      END) = 8 
) 
update MonitorTable set ReadToGrid = 0 where WeekNum in (select WeekNum from cte Where RowNum > 2) 
+1

Windowing-Funktionen: die Lösung für jedes Problem –

+0

Danke. Was ist der Unterschied zwischen dem Vorschlag von vkp und deinem Code? – rbhat

+0

Dieser Code funktioniert auch dann, wenn fehlende Nummern fehlen, die in Ihrer Situation möglicherweise nie vorkommen oder möglicherweise auftreten. Ich bin gerne zukunftssicher, wenn es nicht viel zusätzliche Arbeit ist. Zum Beispiel, wenn Sie 1,2,3,4,6 haben. Wenn weeknum minus two verwendet wird, wird -1, 0, 1, 2, 4 zurückgegeben, was 6 auslässt und die anderen gibt. Wenn row_number für dieselben Daten verwendet wird, wird 1,2,3 zurückgegeben –

Verwandte Themen