I think that ROW_NUMBER should be working like in example
if OBJECT_ID('tempdb.dbo.#lt') is not null
drop table #lt
create table #lt (p int, c int)
insert into #lt
values
(1,0),
(2,1),
(3,1),
(4,1),
(5,2),
(6,2),
(7,3),
(8,3);
with cte as
(
select *, level = 1, rn = ROW_NUMBER() over (order by p) from #lt where c in (0)
union all
select *,
rn = ROW_NUMBER() over (partition by level order by p)
from (
select c.*,
level = c2.level + 1
from #lt c
inner join cte c2
on c2.p = c.c
)as t
)
select
*,
rn_expected = ROW_NUMBER() over (partition by level order by p)
from cte
order by level,p
p c level rn rn_expected
- - ------ -- -----------------
1 0 1 1 1
2 1 2 1 1
3 1 2 2 2
4 1 2 3 3
5 2 3 1 1
6 2 3 2 2
7 3 3 1 3
8 3 3 2 4
commented on May 8 2012 4:15AM