Sql server 2008 r2 SQL Server:如何从同一个表中检索顶级组id

Sql server 2008 r2 SQL Server:如何从同一个表中检索顶级组id,sql-server-2008-r2,Sql Server 2008 R2,我有SQLServer2008R2 我的源表如下所示: EmpID Name GroupID ------------------------- 1-KFX xxx 7-ZQMN 7-ZQMN yyy null AXM-4 zzz 1-KFX 7-ZQOP JJJ QRS-0 QRS-0 kkk null 等等 我需要遍历表,为每个EmpID获取Top-GroupID(层次结构中的顶部),直到G

我有SQLServer2008R2

我的源表如下所示:

EmpID      Name   GroupID
-------------------------
1-KFX       xxx    7-ZQMN
7-ZQMN      yyy    null
AXM-4       zzz    1-KFX
7-ZQOP      JJJ    QRS-0
QRS-0       kkk    null
等等

我需要遍历表,为每个
EmpID
获取
Top-GroupID
(层次结构中的顶部),直到
GroupID
为空,如果
GroupID
为空,则填充
EmpID

我试图写一个查询,以实现如下结果,任何帮助都是感激的

EmpID    Name   TopGroupID
------------------------
1-KFX    xxx        7-ZQMN
7-ZQMN   yyy        7-ZQMN
AXM-4    zzz        7-ZQMN
7-ZQOP   JJJ        QRS-0
QRS-0    kkk        QRS-0

该层次结构问题通过使用查找根节点来解决

CREATE TABLE #tt(EmpID VARCHAR(128) NOT NULL PRIMARY KEY,Name VARCHAR(128),GroupID VARCHAR(128));
INSERT INTO #tt(EmpID,Name,GroupID)VALUES
    ('1-KFX','xxx','7-ZQMN'),
    ('7-ZQMN','yyy',null),
    ('AXM-4','zzz','1-KFX'),
    ('7-ZQOP','JJJ','QRS-0'),
    ('QRS-0','kkk',null);

;WITH cte_tr AS (
    SELECT EmpId, GroupID, depth=0
    FROM #tt
    UNION ALL -- what follows is the recursion in the CTE to find the parent, keeping track of depth
    SELECT cte_tr.EmpID, GroupId=t.GroupID, depth=cte_tr.depth+1
    FROM cte_tr 
         INNER JOIN #tt AS t ON 
             t.EmpID=cte_tr.GroupID
    WHERE t.GroupID IS NOT NULL
),
cte_depth AS ( -- select the maximum depth for a starting node
    SELECT EmpID, max_depth=MAX(depth)
    FROM cte_tr
    GROUP BY EmpID
)
SELECT cte_depth.EmpID, TopGroupId=ISNULL(cte_tr.GroupID,cte_tr.EmpID)
FROM cte_depth 
     INNER JOIN cte_tr ON -- select the nodes at the maximum depth
         cte_tr.EmpID=cte_depth.EmpID AND 
         cte_tr.depth=cte_depth.max_depth
ORDER BY cte_tr.EmpID;

DROP TABLE #tt;
结果:

+--------+------------+
| EmpID  | TopGroupId |
+--------+------------+
| 1-KFX  | 7-ZQMN     |
| 7-ZQMN | 7-ZQMN     |
| 7-ZQOP | QRS-0      |
| AXM-4  | 7-ZQMN     |
| QRS-0  | QRS-0      |
+--------+------------+

该层次结构问题通过使用查找根节点来解决

CREATE TABLE #tt(EmpID VARCHAR(128) NOT NULL PRIMARY KEY,Name VARCHAR(128),GroupID VARCHAR(128));
INSERT INTO #tt(EmpID,Name,GroupID)VALUES
    ('1-KFX','xxx','7-ZQMN'),
    ('7-ZQMN','yyy',null),
    ('AXM-4','zzz','1-KFX'),
    ('7-ZQOP','JJJ','QRS-0'),
    ('QRS-0','kkk',null);

;WITH cte_tr AS (
    SELECT EmpId, GroupID, depth=0
    FROM #tt
    UNION ALL -- what follows is the recursion in the CTE to find the parent, keeping track of depth
    SELECT cte_tr.EmpID, GroupId=t.GroupID, depth=cte_tr.depth+1
    FROM cte_tr 
         INNER JOIN #tt AS t ON 
             t.EmpID=cte_tr.GroupID
    WHERE t.GroupID IS NOT NULL
),
cte_depth AS ( -- select the maximum depth for a starting node
    SELECT EmpID, max_depth=MAX(depth)
    FROM cte_tr
    GROUP BY EmpID
)
SELECT cte_depth.EmpID, TopGroupId=ISNULL(cte_tr.GroupID,cte_tr.EmpID)
FROM cte_depth 
     INNER JOIN cte_tr ON -- select the nodes at the maximum depth
         cte_tr.EmpID=cte_depth.EmpID AND 
         cte_tr.depth=cte_depth.max_depth
ORDER BY cte_tr.EmpID;

DROP TABLE #tt;
结果:

+--------+------------+
| EmpID  | TopGroupId |
+--------+------------+
| 1-KFX  | 7-ZQMN     |
| 7-ZQMN | 7-ZQMN     |
| 7-ZQOP | QRS-0      |
| AXM-4  | 7-ZQMN     |
| QRS-0  | QRS-0      |
+--------+------------+
试试这个

select
    empid,
    name
    isnull(max(GroupID),empid) 'TopGroupId'
    from tablename
    group by 
    empid,name
    order by empid
试试这个

select
    empid,
    name
    isnull(max(GroupID),empid) 'TopGroupId'
    from tablename
    group by 
    empid,name
    order by empid

顶级组id是什么意思?@KTP顶级是什么意思?它是最大值吗?Top group id是一个EmpID,其中group id为null。我需要使用table.GroupID=table.EmpID迭代遍历表,以找出最重要的GroupID。嗨,为了更清晰,我编辑了我的内容。empid和groupid实际上不是数字。我需要找出每个EMPID的顶级组id(层次结构中的顶级)顶级组id是什么意思?@KTP顶级组id是什么意思?它是最大值吗?Top group id是一个EmpID,其中group id为null。我需要使用table.GroupID=table.EmpID迭代遍历表,以找出最重要的GroupID。嗨,为了更清晰,我编辑了我的内容。empid和groupid实际上不是数字。我需要找出每个EmpIDHi的顶级组id(层次结构中的顶级),抱歉,为了更清晰,我编辑了我的内容。empid和groupid实际上不是数字。我需要找出每个EmpID的顶级组id(层次结构中的顶级)。嗨,对不起,为了更清晰起见,我编辑了我的内容。empid和groupid实际上不是数字。我需要找出每个EmpID的顶级组id(层次结构中的顶级)。嗨,对不起,为了更清晰起见,我编辑了我的内容。empid和groupid实际上不是数字。我需要找出每个EmpID的顶级组id(层次结构中的顶级)。嗨,对不起,为了更清晰起见,我编辑了我的内容。empid和groupid实际上不是数字。我需要找出每个EmpID的顶级组id(层次结构中的顶级)。