繁体   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