Sql server 2008 r2 SQL Server:如何从同一个表中检索顶级组id
我有SQLServer2008R2 我的源表如下所示: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
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(层次结构中的顶级)。