;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 i s рассчитывается – TheGameiswar
@TheGameiswar: hierarchyid рассчитывается вручную, в зависимости от их размещения. –
Технически, '/ 1/1/1 /' * * - это иерархический максимум. Поскольку вы, по-видимому, хотите использовать другое определение «* иерархического максимума *», чем стандарт, вам нужно будет рассказать нам, каково ваше определение. – RBarryYoung