【问题标题】:How to PARTITION BY and classify certain rows into groups如何对某些行进行 PARTITION BY 和分类
【发布时间】: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


【解决方案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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2013-07-27
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多