【问题标题】:SQL: row_number: order by date asc Need Nulls to be LastSQL:row_number:按日期排序,最后需要 Null
【发布时间】:2019-02-28 18:43:29
【问题描述】:

由于我的 DBMS 不允许在 order by 子句中使用“Nulls Last”,因此我需要以下方面的帮助。

row_number() over(partition by a.ID order by a.Date asc

我需要我的行有一个按 ID 排序的行号序列,按日期升序排列,但空日期行在我的序列中是最后一个。显然,如果我可以在我的订单中只说“NULLS LAST”,那就太好了,但是,我的 dbms (MSSQL) 不允许这样做。

例如目前正在发生的事情:

ID   Date     ROW_NUMBER
1    NULL      1
1    1/2/17    2
1    1/3/17    3
2    NULL      1
2    2/2/17    2
2    2/3/17    3
2    2/4/17    4

我想要发生的事情:

ID   Date     ROW_NUMBER
1    1/2/17    1
1    1/3/17    2
1    NULL      3
2    2/2/17    1
2    2/3/17    2
2    2/4/17    3
2    NULL      4

帮助?谢谢!

【问题讨论】:

    标签: sql sql-server sql-order-by partition row-number


    【解决方案1】:

    只需在order by 中添加另一个密钥:

    row_number() over (Partition by a.ID
                       order by (case when a.date is not null then 1 else 2 end),
                                a.Date asc
                      )
    

    【讨论】:

    • 很遗憾,您无法将感叹号转换为代表,戈登,您今天可能已经超越了 Jon Skeet。 ;-)
    【解决方案2】:

    在运行中,使用 ISNULL 将所有空值视为最大可能日期。

    row_number() over(Partition by a.ID 
         order by ISNULL(a.Date, CAST('9999/12/31' AS DATETIME)) asc
    )
    

    【讨论】:

    • 啊,谢谢 :) 这也很有效,但更混乱。谢谢!
    • 如果您认为我的回答比较混乱,您应该接受@Gordon Linoff 的回答。无论如何,他首先提出了一个可行的解决方案。 :-)
    猜你喜欢
    • 2016-07-24
    • 2014-01-27
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多