【发布时间】:2020-12-14 08:54:56
【问题描述】:
我有一个如下所示的数据集:
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
我想分配一个行号,使得 row = 1 是基于时间列的最后一行。然而,棘手的部分是我希望如何分组。首先,我需要查询将下划线之前的任何内容视为一个组。例如,“SE”有 6 行。这应该是第一种分组方法。然后,我想将以“_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 ...
我不知道如何进行第二次分组。
【问题讨论】:
-
为什么 R_S = 2 的结果?
-
@forpas 很好。这已得到纠正。
标签: sql tsql sql-server-2008-r2 partition