Sql server 关系划分:查找每个“关系”的唯一集合;“儿童”;列中的值
经过大量搜索,似乎大多数Sql server 关系划分:查找每个“关系”的唯一集合;“儿童”;列中的值,sql-server,tsql,relational-division,Sql Server,Tsql,Relational Division,经过大量搜索,似乎大多数关系划分问题都是针对具有匹配成员的目标群体。也许我的关键字有问题,但我想要的是一些不同的东西:给定一个父/组和一组子/成员,我如何找到每个成员的唯一组合,而不考虑父/组 使用以下示例源 CREATE TABLE #m (Parent char(1), ChildID int) INSERT INTO #m VALUES ('a',1), ('a', 2), ('a',4), ('b',1), ('b', 3), ('b',4), ('c',1
关系划分问题都是针对具有匹配成员的目标群体。也许我的关键字有问题,但我想要的是一些不同的东西:给定一个父/组和一组子/成员,我如何找到每个成员的唯一组合,而不考虑父/组
使用以下示例源
CREATE TABLE #m (Parent char(1), ChildID int)
INSERT INTO #m
VALUES ('a',1), ('a', 2), ('a',4),
('b',1), ('b', 3), ('b',4),
('c',1), ('c', 4), ('c',2),
('d',1), ('d',4),
('e',3), ('e', 1),
('f',4),
('g',3), ('g', 4), ('g',1);
SELECT * FROM #m
我将寻找一个像(1,2,4),(1,3,4),(1,4),(1,3),(4)这样的结果,表示为一个新的临时表(连接回#m
,这样每个父项
都可以指向其“哈希”,而不是其匹配的父项
)
这东西上有很多东西;对我来说是最有意义的,但我还没有找到答案。抱歉,我找不到重复的内容
编辑:以SQL结果集表示的所需结果:
UParent ChildID
------- -----------
u1 1
u1 2
u1 4
u2 1
u2 3
u2 4
u3 1
u3 4
u4 1
u4 3
u5 4
如果我错了,请纠正我,您的数据存储方式是否已达到您希望的格式
我从给定的样本数据中尝试了这个查询,它生成了您期望的结果集。看看这里
SELECT 'u' + CAST(DENSE_RANK() OVER (ORDER BY Parent) AS VARCHAR(10)) AS UParent
,ChildID
FROM #m
结果集
╔═════════╦═════════╗
║ UParent ║ ChildID ║
╠═════════╬═════════╣
║ u1 ║ 1 ║
║ u1 ║ 2 ║
║ u1 ║ 4 ║
║ u2 ║ 1 ║
║ u2 ║ 3 ║
║ u2 ║ 4 ║
║ u3 ║ 1 ║
║ u3 ║ 4 ║
║ u3 ║ 2 ║
║ u4 ║ 1 ║
║ u4 ║ 4 ║
║ u5 ║ 3 ║
║ u5 ║ 1 ║
║ u6 ║ 4 ║
║ u7 ║ 3 ║
║ u7 ║ 4 ║
║ u7 ║ 1 ║
╚═════════╩═════════╝
我明白了,你想要孩子们的“独特”组合,不管顺序如何
以下是等效的父级:
select m1.Parent as Parent1, m2.Parent as Parent2
from (select m.*, count(*) over (partition by Parent) as NumKids
from #m m
) m1 join
(select m.*, count(*) over (partition by Parent) as NumKids
from #m m
) m2
on m1.ChildID = m2.ChildID
group by m1.Parent, m2.Parent
having count(*) = max(m1.NumKids) and max(m1.NumKids) = max(m2.NumKids);
我们现在可以用这个得到你想要的
with parents as (
select m1.Parent as Parent1, m2.Parent as Parent2
from (select m.*, count(*) over (partition by Parent) as NumKids
from #m m
) m1 join
(select m.*, count(*) over (partition by Parent) as NumKids
from #m m
) m2
on m1.ChildID = m2.ChildID
group by m1.Parent, m2.Parent
having count(*) = max(m1.NumKids) and max(m1.NumKids) = max(m2.NumKids)
)
select distinct m.*
from (select min(Parent2) as theParent
from parents
group by Parent1
) p join
#m m
on p.theParent = m.Parent;
如果需要新id而不是旧id,请使用:
select dense_rank() over (partition by m.Parent) as NewId, m.ChildID
在中选择这将使用for xml
构建一个排序的子id列表,该列表用作rank()函数的分区子句
select M.Parent,
M.ChildID
from (
select M1.Parent,
M1.ChildID,
rank() over(partition by (
select cast(ChildID as varchar(11))+','
from #m as M2
where M1.Parent = M2.Parent
order by M2.ChildID
for xml path('')
)
order by M1.Parent) as rn
from #m as M1
) as M
where M.rn = 1;
该结果基于什么?你能更好地描述一下你需要什么吗?结果应该是什么样的呢?SQL表有固定数量的列。@GordonLinoff它是基于用眼睛读取值集,然后列出它们。这样表达是因为我不喜欢伪造无法获得的SQL结果,但我会这样做。“我如何找到每个成员的独特组合,而不考虑其父母?”这不是我需要的一个很好的描述吗?是否有最大数量的子成员?@GordonLinoff理论上说,没有,但在我的具体/当前实现中,它远低于100。你在学习吗?谢谢,这里面有一点不好的语法(额外的join#m m2
)对于那些遵循原始代码的人,parentId=>Parent和child=>ChildID。我指的是数学意义上的“独特组合”,是的,不管顺序如何。在你脑子里,没有CTE有没有办法做到这一点?@downwitch。我认为这些都是固定的,但听起来你已经让它工作了。是的,一旦我做了这些更改,你的解决方案就工作了。我编辑了我的最后一条评论(输入得太早了),问了一个问题:在没有CTE的情况下,有没有办法做到这一点?@downwitch。对CTE只能插在父级
引用所在的位置。这是一个CTE。将坚持接受,以查看是否有其他人提供了其他解决方案,谢谢。不,因为在您的结果中,u1和u3(例如)具有相同的成员。每一组成员的一个实例就是目标。