【问题标题】:Find Max Hierarchyid in SQL Server在 SQL Server 中查找 Max Hierarchyid
【发布时间】:2016-04-30 13:11:43
【问题描述】:

如何找到hierarchyid类型列的max

例如:

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/

提前致谢。

【问题讨论】:

  • 继承权是如何计算的
  • @TheGameiswar : hierarchyid 是根据它们的位置手动计算的。
  • 技术上,/1/1/1/ 层级最大值。由于您显然想使用与标准不同的“层次最大值”定义,因此您必须告诉我们您的定义是什么。
  • 嘿!您是否尝试过以下答案中的任何解决方案?

标签: sql sql-server tsql sql-server-2012 hierarchy


【解决方案1】:

您可以使用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

【讨论】:

  • 如果我再插入一行,user_hierarchyid 为/1/1/2/,两个查询都会返回/1/1/1//1/1/2/。在这里,我将 user_hierarchyid 设置为/1/1/2/,因为它是最大层次结构。
  • @PankajJawale 请定义maximum hierarchically,因为起初我将其理解为deepest。如果有/1/1/1/1/2/1呢?
【解决方案2】:

你可以像下面这样做

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

【讨论】:

  • 如果有像/10/11/这样的值并且大于/1/1/2/怎么办?
【解决方案3】:
;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/

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多