【问题标题】:CASE with Row_Num带有 Row_Num 的 CASE
【发布时间】:2021-03-16 09:12:31
【问题描述】:

我在 SQL Server 2016 中有一个表,其中每个唯一的 PartnerNumber 都有多个 ConnectorId 值和多个 CommissionDate

我的要求是,当我在最终结果中查询表时,我应该只获取具有 rn = 1 的行,这是使用以下查询工作的,但在此示例中 P1 根据当前逻辑它选择 rn = 的行1 但我另外想要的是,如果 rn = 1 的 CommissionDate 为 NULL,那么在这种情况下,如果不为 null,则显示 rn = 2 的值,然后继续 rn = 1

表格脚本:

CREATE table #Final_Data
(
  CommissionDate date,
  PartnerNumber varchar(50),
  Connector_Id varchar(50),
 )

GO

insert into #Final_Data (CommissionDate,PartnerNumber,Connector_Id)
VALUES (NULL,'P1','C1'), ('2017-12-27','P1','C2')
,('2015-09-14','P2','C3'),('2011-09-13','P2','C4') 
,(NULL,'P3','C5'),(NULL,'P3','C6') 

GO

查询:

;WITH CTE
AS
(
SELECT CommissionDate,PartnerNumber,Connector_Id,
ROW_NUMBER() OVER (Partition by PartnerNumber  ORDER BY CommissionDate asc) AS rn
FROM #Final_Data
)

SELECT TOP  9999999 * FROM CTE where rn = 1 
ORDER BY PartnerNumber

实际输出:

CommissionDate  PartnerNumber   Connector_Id    rn
NULL                 P1              C1         1
2011-09-13           P2              C4         1
NULL                 P3              C5         1

预期输出

CommissionDate  PartnerNumber   Connector_Id       rn
    2017-12-27           P1              C2         2
    2011-09-13           P2              C4         1
    NULL                 P3              C5         1

【问题讨论】:

    标签: sql sql-server greatest-n-per-group common-table-expression sql-null


    【解决方案1】:

    GMB 的回答是正确的。但是,它通常更简洁地表示为:

    ROW_NUMBER() OVER (
        PARTITION BY PartnerNumber  
        ORDER BY COALESCE(CommissionDate, '9999-01-01')
    ) AS rn
    

    这允许ORDER BY 只有一个键。它本质上是 SQL 标准语法的简写:

    ROW_NUMBER() OVER (
        PARTITION BY PartnerNumber  
        ORDER BY CommissionDate NULLS LAST
    ) AS rn
    

    哪些 SQL Server 不(还???)支持。

    【讨论】:

      【解决方案2】:

      您可以在窗口函数的order by 子句中使用条件排序:

      ROW_NUMBER() OVER (
          PARTITION BY PartnerNumber  
          ORDER BY CASE WHEN CommissionDate IS NOT NULL THEN 0 ELSE 1 END,
          CommissionDate
      ) AS rn
      

      【讨论】:

        猜你喜欢
        • 2015-10-02
        • 2021-10-12
        • 1970-01-01
        • 2021-10-10
        • 2017-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        相关资源
        最近更新 更多