Условное ранжирование с использованием операторов SQL - PullRequest
0 голосов
/ 15 мая 2019

Мне нужно ранжировать строки с двумя условиями.

| 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, но он не работает.

1 Ответ

0 голосов
/ 15 мая 2019

Я думаю, что это логика, которую вы хотите:

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.

Это соответствует тому, как вы сформулировали вопрос, но есть и другие возможности.

...