重置 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;
我在 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;