Как РАЗДЕЛИТЬ ПО и классифицировать определенные строки в группы

#sql #tsql #sql-server-2008-r2 #partition

#sql #tsql #sql-server-2008-r2 #раздел

Вопрос:

У меня есть набор данных, который выглядит следующим образом:

 R_E         2020-08-20 16:37:37.693
R_S         2020-08-20 16:37:25.520
SE_E        2020-08-20 16:37:24.107
SA_E        2020-08-20 16:37:21.900
SA_S        2020-08-20 16:37:06.270
SE_R        2020-08-20 06:00:00.000
SE_P        2020-08-20 05:00:00.000
SE_R        2020-08-19 18:00:00.000
SE_P        2020-08-19 17:00:00.000
SE_S        2020-08-19 16:37:23.283
  

Я хочу присвоить номер строки таким образом, чтобы строка = 1 была последней строкой на основе столбца времени. Однако сложная часть заключается в том, как я хочу, чтобы это было сгруппировано. Во-первых, мне нужно, чтобы запрос рассматривал все, что находится перед подчеркиванием, как одну группу. Так, например, есть 6 строк для ‘SE’. Это должен быть первый метод группировки. Затем я хочу сгруппировать строки, заканчивающиеся на ‘_S’ и ‘_E’, как одну группу, а строки, заканчивающиеся на ‘_P’ и ‘_R’, как другую группу. Как мне написать функцию row_number() в моем запросе, чтобы конечный результат выглядел следующим образом:

 R_E         2020-08-20 16:37:37.693    1
R_S         2020-08-20 16:37:25.520    2
SE_E        2020-08-20 16:37:24.107    1
SA_E        2020-08-20 16:37:21.900    1
SA_S        2020-08-20 16:37:06.270    2
SE_R        2020-08-20 06:00:00.000    1
SE_P        2020-08-20 05:00:00.000    2
SE_R        2020-08-19 18:00:00.000    3
SE_P        2020-08-19 17:00:00.000    4
SE_S        2020-08-19 16:37:23.283    2
  

Это все, что я получил:

 select

        *
        , row_number() over(partition by substring(j.Uf_Status, 1, charindex('_', j.Uf_Status) - 1) order by j.Uf_Time desc) lastrows 

from ...
  

Я не могу понять, как выполнить вторую группировку.

Комментарии:

1. Почему результат для R_S = 2?

2. @forpas хороший улов. Это было исправлено.

Ответ №1:

Если я правильно понимаю, вы можете использовать case выражение:

 row_number() over (partition by left(j.Uf_Status, charindex('_', j.Uf_Status) - 1),
                                (case when j.uf_status like '%[SE]' then 1
                                      when j.uf_status like '%[PR]' then 2
                                      else 3
                                 end)
                   order by j.Uf_Time desc
                  ) as lastrows