;WITH cte AS (
SELECT name, CAST(user_hierarchyid as hierarchyid) as user_hierarchyid
FROM (VALUES
('Craig', '/'),
('Steve', '/1/'),
('John', '/1/1/'),
('Matt', '/1/1/1/'),
('Sam', '/2/'),
('Chris', '/2/2/')
) as t(name, user_hierarchyid)
)
SELECT TOP 1
name,
CAST(user_hierarchyid as nvarchar(20)) as user_hierarchyid
FROM (
SELECT *,
user_hierarchyid.GetAncestor(CASE WHEN user_hierarchyid.GetLevel() > 0 THEN user_hierarchyid.GetLevel()-1 ELSE user_hierarchyid.GetLevel() END) as ga,
user_hierarchyid.GetLevel() as gl
FROM cte
) as t
ORDER BY Rank() OVER (PARTITION BY ga ORDER BY gl,user_hierarchyid) desc, ga DESC
輸出:
name user_hierarchyid
----- -----------------
Matt /1/1/1/
(1 row(s) affected)
如果添加一行('Dave', '/1/1/2/'),
然後輸出將是Dave /1/1/2/
如果添加一行('Tony', '/2/2/1/'),
然後輸出將是Dave /1/1/2/
如果添加('Ann', '/2/2/2/'),
行則輸出將是Ann /2/2/2/
如果添加排('Vic', '/1/1/1/1/'),
然後輸出將是Vic /1/1/1/1/
如何heirrachy我s計算 – TheGameiswar
@TheGameiswar:hierarchyid是根據它們的位置手動計算的。 –
從技術上講,'/ 1/1/1 /'*是分級最大值。既然你顯然希望使用不同於標準的'*等級最大值*'的不同定義,你將不得不告訴我們你的定義是什麼。 – RBarryYoung