如果Rownumber = 1且条件然后条件

时间:2016-06-27 08:33:13

标签: sql sql-server

我对sql结果以及如何实现以下内容有疑问。

Screenshot of Resultset

在屏幕截图中,每个ID都有一个Rownumber,每个ID都有另一个具有状态' old'或者'处理过的'。我想要的是,如果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

2 个答案:

答案 0 :(得分: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 :(得分:0)

  • 创建公用表表达式
  • 根据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'