2016-06-29 6 views
0

私は次のようになります。CTEを持っている:最後の2つを除くすべてを更新しますか?

;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) 

ここでの問題は、それがすべてを更新するということです。常に2つの左になければならないので、私は最後のものを除くすべてを更新することができます。

それでは、CTEは、以下を返すことにしましょう:

1 
2 
3 
4 
5 
6 

私はすべてを更新することはできません。最後の2つ(1,2,3,4)を除くすべてを更新する必要があります。

最後の2行以外のすべてを更新するようにスクリプトを変更するにはどうすればよいですか?

ありがとうございました。

+0

変更 'WHERE'条件を? –

+0

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

答えて

1

データがなければ、私は、正確な構文をテストカントが、アイデアは動作します: `WEEKNUM(CTEからWEEKNUM-2を選択)で`へ

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

ウィンドウ関数:すべての問題の解決 –

+0

ありがとう。 vkpの提案とあなたのコードの違いは何ですか? – rbhat

+0

このコードは、あなたの状況では決してないかもしれない、または最終的に起こる可能性のある番号が見つからなくても機能します。私はそれほど余分な仕事がなければ、将来の証拠が好きです。たとえば、1,2,3,4,6がある場合。 weeknumマイナス2を使用すると、-1、0、1、2、4が返され、6を省略して他のものを与えます。同じデータに対してrow_numberを使用すると1,2,3が返されます –

関連する問題