#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