У меня есть следующие образцы данных: car_id owner_id service_date 1 user2 2016-01-02 00:00:00 1 user2 2016-03-02 00:00:00 1 user3 2016-11-02 00:00:00 1 user4 2017- 01 -...

1
Orkun Berk Yuzbasioglu 3 Янв 2021 в 19:25

1 ответ

Лучший ответ

Попробуй это:

;WITH CTE AS
(
    SELECT *,           
            CASE 
              WHEN owner_id <> COALESCE(LAG(owner_id) OVER 
                                  (PARTITION BY car_id ORDER BY service_date), owner_id) 
                     THEN 1
              ELSE 0 
            END AS grp
    FROM #tb_example
)
SELECT *,
       SUM(grp) OVER (PARTITION BY car_id ORDER BY service_date) + 1 AS rnk
FROM cte 
ORDER BY service_date;

Демо здесь

Запрос использует LAG для обнаружения изменений в owner_id в том же разделе car_id в порядке, определенном servic_date.

Используя поле grp, мы используем SUM(grp) OVER .. для вычисления ранга как промежуточной суммы изменений.

1
Giorgos Betsos 3 Янв 2021 в 16:43