【问题标题】:SQL - only increment ROW_NUMBER() on specific valuesSQL - 仅在特定值上增加 ROW_NUMBER()
【发布时间】:2022-07-07 00:00:49
【问题描述】:

我有下表,我正在尝试使用行号添加一列(按产品分区并按合同开始日期排序),该列仅在 contract_status_id 不是 4 时才会增加。如果 contract_status_id 是 4,它应该显示为 -1

所以下面的列将显示为 1、 2、 -1, 3、

实现这一目标的最佳方法是什么?我现有的代码如下所示.. 但这是我的行号知识!

行号() 超过 ( 按产品划分 ORDER BY a.contract_start_date ASC )

【问题讨论】:

标签: sql sql-server-2016


【解决方案1】:

首先,您需要一列来指示状态(表 x)。然后您通过分区(表 z)获得您关心的行号。最后,您修复这些值以匹配您需要的值。

SELECT -- all the stuff
  CASE WHEN z.c_status = 1 THEN val ELSE -1 END as final_result
  FROM (
    SELECT -- all the stuff
      Row_number() OVER ( partition BY x.product,x.c_status ORDER BY x.contract_start_date ASC ) as val
    FROM (
      SELECT -- all the stuff,
        CASE WHEN contract_status_id=1 THEN 1 ELSE 0 END as c_status
      FROM tableyoudidnotname
    ) x
  ) z

【讨论】:

    【解决方案2】:

    有几种方法可以做到这一点。您可以使用ROW_NUMBER 开始,但您需要使用IIF 对合约状态进行分区:

    CASE Contract_Status_ID WHEN 4 THEN -1
         ELSE ROW_NUMBER() OVER (PARTITION BY Product, IIF(Contract_Status_ID  = 4,1,0) ORDER BY Contract_Start_Date)
    END
    

    您也可以使用条件COUNT

    CASE Contract_Status_ID WHEN 4 THEN -1
         ELSE COUNT(CASE WHEN Contract_Status_ID != 4 THEN 1 END) OVER (PARTITION BY Product  ORDER BY Contract_Start_Date)
    END
    

    【讨论】:

      猜你喜欢
      • 2017-11-14
      • 2021-11-27
      • 2013-02-14
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      相关资源
      最近更新 更多