Sql 使用CTE确定家庭成员的特定层次ID

Sql 使用CTE确定家庭成员的特定层次ID,sql,sql-server,tsql,common-table-expression,hierarchy,Sql,Sql Server,Tsql,Common Table Expression,Hierarchy,我试图弄清楚如何在使用CTE时将递增ID附加到我的结果集 我的表格包含如下数据: PersonId ParentLinkId Relation Name 1 NULL F John Doe 2 1 S Jane Doe 3 1 C Jack Doe 4 1 C

我试图弄清楚如何在使用CTE时将递增ID附加到我的结果集

我的表格包含如下数据:

PersonId   ParentLinkId   Relation  Name
   1          NULL           F       John Doe
   2           1             S       Jane Doe
   3           1             C       Jack Doe
   4           1             C       Jill Doe
我想添加一个名为RelationId的列。基本上,“F”人总是得到“1”,关系“S”总是得到“2”,任何后续的“C”关系都会得到3、4、5……等等

它们由ParentLinkId链接,因此ParentLinkId=PersonId

我试图使用CTE递归地增加这个值,但我一直被困在一个无限循环中

我试过:

WITH FinalData( ParentId, ParentLinkId, Name, Relationship, RelationshipId) AS 
(
    SELECT  ParentId
           ,ParentLinkId
           ,Name
           ,Relationship
           ,1
    FROM FamTable
    WHERE ParentLinkId IS NULL
    UNION ALL
    SELECT FT.ParentId
          ,ParentLinkId
          ,Name
          ,Relationship
          ,RelationshipId + 1
    FROM FamTable FT
    INNER JOIN FinalData ON FT.ParentLinkId = FinalData.ParentId
)
SELECT * FROM 
FinalData
这是我不断得到的结果:

PersonId   ParentLinkId   Relation     Name     RelationshipId
   1           NULL          F       John Doe         1
   2            1            S       Jane Doe         2
   3            1            C       Jack Doe         2
   4            1            C       Jill Doe         2
应该是

PersonId   ParentLinkId   Relation     Name     RelationshipId
   1           NULL          F       John Doe         1
   2            1            S       Jane Doe         2
   3            1            C       Jack Doe         3
   4            1            C       Jill Doe         4

我想我正在接近使用CTE,但任何在正确方向上的帮助或推动都将不胜感激

这听起来像是一个简单的
行编号()

他是一把小提琴

select f.*,
       row_number() over (partition by coalesce(ParentLinkId, PersonId)
                          order by (case when relation = 'F' then 1
                                         when relation = 'S' then 2
                                         when relation = 'C' then 3
                                    end), PersonId
                         ) as relationId                                         
from famtable f;