簡體   English   中英

如果行數= 1且有條件,則有條件

[英]If Rownumber = 1 and Condition Then Condition

我對sql結果以及如何實現以下內容有疑問。

屏幕截圖

在屏幕截圖中,每個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

將您的查詢放在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] 
  • 創建公用表表達式
  • 根據RN = 1和Status = Processed更新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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM