【问题标题】:Conditional Rank using SQL statements使用 SQL 语句的条件排名
【发布时间】:2019-05-15 15:51:01
【问题描述】:

我必须用两个条件对行进行排名。

| CBorderIID  |  CustomerID | CBDate  | orderID    |OrderDate  |
+-------------+-------------+---------+------------+-----------+
|  355253780  |      5314   |1/29/2017| 355253780  | 1/29/2017 |
|  355253780  |      5314   |1/29/2017| 359324061  | 4/5/2017  |
|  355253780  |      5314   |1/29/2017| 368700530  | 5/16/2017 |
|  355253780  |      5314   |1/29/2017| 375164457  | 9/11/2017 |
|  482387847  |      5384   |1/29/2017| 446421606  | 7/27/2018 |
|  482387847  |      5384   |1/29/2017| 449212357  | 8/5/2018  |
|  482387847  |     5384    |1/29/2017| 482387847  | 1/12/2019 |
|  482387847  |      5384   |1/29/2017| 489428993  | 2/23/2019 |

我想将 CBorderIID = OrderID 的行排名为 1,然后当 CBorderIID OrderID 和 CBdate

期望的输出

| CBorderIID  |  CustomerID | CBDate  | orderID    |OrderDate  | Rank
+-------------+-------------+---------+------------+-----------+------
|  355253780  |      5314   |1/29/2017| 355253780  | 1/29/2017 | 1
|  355253780  |      5314   |1/29/2017| 359324061  | 4/5/2017  | 2
|  355253780  |      5314   |1/29/2017| 368700530  | 5/16/2017 | 3
|  355253780  |      5314   |1/29/2017| 375164457  | 9/11/2017 | 4
|  482387847  |      5384   |1/29/2017| 446421606  | 7/27/2018 | NULL
|  482387847  |      5384   |1/29/2017| 449212357  | 8/5/2018  | NULL
|  482387847  |     5384    |1/29/2017| 482387847  | 1/12/2019 | 1
|  482387847  |      5384   |1/29/2017| 489428993  | 2/23/2019 | 2

我尝试使用分区超过OrderID 的条件进行行排名,但它不起作用。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 能再解释一下NULL的逻辑吗?

标签: sql sql-server-2016


【解决方案1】:

我认为这是你想要的逻辑:

select t.*
       (case when CBdate < O.orderdate
             then rank() over (partition by CBorderIID
                               order by ((case when CBorderIID = orderID then 1 else 2 end),
                                         OrderDate
                                        ) as rank
        end)
from t;

注意:如果没有匹配CBorderIID = orderID,则第一个订单日期的排名为 1。如果多个匹配,则所有订单的排名为 1。

这些与您提出问题的方式一致,但也有其他可能性。

【讨论】:

    【解决方案2】:

    您可以将row_number() 与已定义的组一起使用:

    select t.*, 
          (case when grp = 1 and CBdate <= orderdate 
                then row_number() over (partition by CBorderIID, CustomerID, grp order by OrderDate)
           end) as Rank
    from (select t.*, 
                 sum(case when CBorderIID = orderID then 1 else 0 end) over (partition by CBorderIID, CustomerID order by orderdate) as grp
          from table t
         ) t;
    

    【讨论】:

      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      相关资源
      最近更新 更多