2016-06-27 26 views
0

私はSQLの結果と以下の達成方法について質問があります。スクリーンショットでRownumber = 1かつ条件Then条件

Screenshot of Resultset

、そこROWNUMBERは、すべてのIDのためであり、すべてのIDは、「古い」または「処理済み」のステータスを持っている別の列を持っています。私が望むのは、RN = 1でステータスが処理されている場合、このIDの他のすべてのRNもステータス「処理済」である必要があります。

これをSQLで実現する可能性はありますか?

SELECT RN = ROW_NUMBER() OVER (PARTITION BY [NODE_NAME] 
ORDER by REPORTING_RELEVANT_STATUS_ID DESC, BILLING_PERIOD DESC) 
     ,[CI_EQUIPMENT_ID] AS ID_PART 
     ,[REPORTING_RELEVANT_STATUS_ID] AS REPORTING_RELEVANT 
     ,[BILLING_PERIOD] 
    , [NODE_NAME] 
     FROM Table 
+0

をあなたができることは、少なくとも列名とデータをポストです。関連するテーブルDDLとサンプルデータをDMLとして含めるように質問を編集してください。 –

+0

正確に何をしたいですか? – NEER

+0

2番目の列の値が異なります。私は 'row_number'をで区切るためにあなたが使っているのは' NODE_NAME'だと思います。値 '13 'があるとすれば' row_number'から 'partition by'を削除します。 –

答えて

1

CTEにクエリを入力しますか?その後、実際のテーブルでそれを登録しよう:

;WITH cte AS (
SELECT RN = ROW_NUMBER() OVER (PARTITION BY [NODE_NAME] 
ORDER by REPORTING_RELEVANT_STATUS_ID DESC, BILLING_PERIOD DESC) 
     ,[CI_EQUIPMENT_ID] AS ID_PART 
     ,[REPORTING_RELEVANT_STATUS_ID] AS REPORTING_RELEVANT 
     ,[BILLING_PERIOD] 
    , [NODE_NAME] 
     FROM Table 
) 

SELECT t.[CI_EQUIPMENT_ID] AS ID_PART, 
     CASE WHEN c.RN is NOT NULL THEN c.REPORTING_RELEVANT ELSE t.[REPORTING_RELEVANT_STATUS_ID] END AS REPORTING_RELEVANT, 
     t.[BILLING_PERIOD], 
     t.[NODE_NAME] 
FROM Table t 
LEFT JOIN (
    SELECT * 
    FROM cte 
    WHERE RN = 1 AND REPORTING_RELEVANT = 'PROCESSED' 
) as c 
    ON c.ID_PART = t.[CI_EQUIPMENT_ID] 
+1

こんにちは、あなたの助けのためのthx、私はテーブルのDDLを作成していた、そして、答えはすでにそこにあった。 CTEのソリューションはうまく動作します。 – MitchRudi

+0

素晴らしい!回答があれば、助けてくれてupvote/acceptを自由に感じてください:) – gofr1

0
  • はRN = 1とステータス=加工に基づいてCTE値を更新する共通テーブル式
  • を作成します。セルフここ

に参加を使用して:

;with CTE (RN,ID_PART,REPORTING_RELEVANT,BILLING_PERIOD,NODE_NAME) AS 
(

    SELECT RN = ROW_NUMBER() OVER (PARTITION BY [NODE_NAME] 
      ORDER by REPORTING_RELEVANT_STATUS_ID DESC, BILLING_PERIOD DESC) 
     ,[CI_EQUIPMENT_ID] AS ID_PART 
     ,[REPORTING_RELEVANT_STATUS_ID] AS REPORTING_RELEVANT 
     ,[BILLING_PERIOD] 
     , [NODE_NAME] 
    FROM Table 
) 
Update CTE1 
    set CTE1.Status='Processed' 
from CTE CTE1 inner join CTE CTE2 
    on CTE1.ID_PART=CTE2.ID_PART 
where CTE2.RN=1 and CTE2.Status='Processed' 
+0

編集のために@Ivanに感謝します。見栄えを良くするためにフォーマットする方法を知らなかった。 –