2016-04-30 175 views
1

如何找到hierarchyidmax類型列?在SQL Server中查找最大Hierarchyid

爲如:

name | user_hierarchyid 
------------------------- 
Craig |/
Steve | /1/ 
John | /1/1/ 
Matt | /1/1/1/ 
Sam | /2/ 
Chris | /2/2/ 

我嘗試使用max(user_hierarchyid)但它返回/2/2/但我想獲得最大的列的層次即/1/1/1/

在此先感謝。

+0

如何heirrachy我s計算 – TheGameiswar

+1

@TheGameiswar:hierarchyid是根據它們的位置手動計算的。 –

+0

從技術上講,'/ 1/1/1 /'*是分級最大值。既然你顯然希望使用不同於標準的'*等級最大值*'的不同定義,你將不得不告訴我們你的定義是什麼。 – RBarryYoung

回答

1

你可以做類似下面

with cte 
as 
(
select name,user_hier_id,replace(user_hierarchyid,'/','') as rplcd 
from table 
) 
select max(rplcd) from cte 
+0

如果像'/ 10/11 /'這樣的值會大於'/ 1/1/2 /'會怎麼樣? – gofr1

3

你可以使用GetLevel()獲得水平和TOP 1 WITH TIES得到 「最高」(最深)值:

SELECT TOP 1 WITH TIES * 
FROM mytable 
ORDER BY user_hierarchyid.GetLevel() DESC; 

LiveDemo

輸出:

╔══════╦══════════════════╗ 
║ name ║ user_hierarchyid ║ 
╠══════╬══════════════════╣ 
║ Matt ║ /1/1/1/   ║ 
╚══════╩══════════════════╝ 

替代地使用RANK()

SELECT * 
FROM (SELECT *, RANK() OVER(ORDER BY user_hierarchyid.GetLevel() DESC) AS rnk 
     FROM mytable) AS s 
WHERE rnk = 1; 

LiveDemo2

+0

如果我再插入一行user_hierarchyid作爲'/ 1/1/2 /',這兩個查詢都會重新執行'/ 1/1/1 /'和'/ 1/1/2 /'。在這裏,我將user_hierarchyid設置爲'/ 1/1/2 /',因爲它是最大的層次結構。 –

+0

@PankajJawale請定義「最高等級」,因爲起初我把它理解爲「最深」。如果有'/ 1/1/1'和'/ 1/2/1'怎麼辦? – lad2025

0
;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/