重置 Row_Number Window 函数

Reset Row_Number Window Function

我在 postgres 中有这样的数据

我的 row_num 专栏是这样创建的: ROW_NUMBER() OVER (PARTITION BY dept_id, name, status ORDER BY dept_id, name, status) as row_num

dept_id      name     status     row_num
1            227      occupied   1
1            227      occupied   2
1            227      vacant     1
1            227      vacant     2
1            227      occupied   3
1            227      occupied   4
1            227      vacant     3
1            227      vacant     4

这就是我想要的样子:

dept_id      name     status     row_num
1            227      occupied   1
1            227      occupied   2
1            227      vacant     1
1            227      vacant     2
1            227      occupied   1
1            227      occupied   2
1            227      vacant     1
1            227      vacant     2

有什么建议吗?

您可以使用 recursive CTE 来创建您期望的结果。

数据结构及查询结果:dbfiddle

with recursive
    cte_r as (
        select dept_id,
               name,
               status,
               row_number() over (partition by dept_id, name) as rn
        from test),
    cte as (
        select dept_id,
               name,
               status,
               rn,
               1 as grp
        from cte_r
        where rn = 1
        union all
        select cr.dept_id,
               cr.name,
               cr.status,
               cr.rn,
               case
                   when cr.status = c.status then grp + 1
                   else 1
                   end
        from cte c,
             cte_r cr
        where c.rn = cr.rn - 1)
select dept_id,
       name,
       status,
       grp as row_num
from cte;