微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server奇怪的分组方案按多列和或

如何解决SQL Server奇怪的分组方案按多列和或

干得好:

with g (rootid, previd, level, keyid, col1, col2, col3) as (
  select keyid, '-', 1, keyid, col1, col2, col3 from item
  union all
  select g.rootid, g.keyid, g.level + 1, i.keyid, i.col1, i.col2, i.col3 
    from g
    join item i on i.col1 = g.col1 or i.col2 = g.col2 or i.col3 = g.col3 
    where i.keyid > g.keyid
),
  m (keyid, rootid) as (
  select keyid, min(rootid) from g group by keyid
)
select * from m;

结果:

keyid  rootid  
-----  ------
a      a       
b      a       
c      a       
d      a       
e      a       
f      a       
g      g       
h      g

:请记住,认情况下,sql Server在处理递归CTE时限制为100次迭代(每个组的行数)。 :即使可以如上所述进行操作,sqlServer可以处理的内容也有明显的限制。如果达到此限制,您将收到以下消息:

在语句完成之前,最大递归100已用尽。

如果发生这种情况,请考虑添加子句option (maxrecursion 32767)

解决方法

我有一个奇怪的分组方案,并且在找出什么是在SQL中进行分组的最佳方法时遇到了一些麻烦。

假设我们有以下一张桌子

CREATE TABLE Item
(
  KeyId VARCHAR(1) NOT NULL,Col1 INT NULL,Col2 INT NULL,Col3 INT NULL
)

GO

INSERT INTO Item (KeyId,Col1,Col2,Col3)
VALUES 
('a',1,2,3),('b',5,4,('c',7,6),('d',8,9),('e',11,10,('f',12,13),('g',20,22,21),('h',23,24)

我需要将此表中的记录分组,以便如果Col1 OR Col2 OR
Col3对于两个记录相同,则这两个记录应该在同一组中,并且应该有链接。换句话说,对于上述数据,记录“ a”(第一条记录)的Col3 = 3,而记录“
b”(第二条记录)的Col3 = 3,因此这两个应该在一组中。但是,然后记录“ b”与记录“ c”具有相同的Col1,因此记录“ c”应与“ a”和“
b”位于同一组中。然后,记录“ d”具有与“ c”相同的Col2,因此它也应该在同一组中。类似地,“ e”和“ f”分别在Col3和Col1中具有相同的值。

另一方面,记录“ g”和“ h”将在一个组中(因为它们具有相同的Col2 = 22),但是该组将与记录“ a”,“ b”,“
c”的组不同,’d’,’e’,’f’。

查询的结果应类似于

KeyId GroupId
'a'   1 
'b'   1
'c'   1
'd'   1
'e'   1
'f'   1
'g'   2
'h'   2

可能有一些使用循环/游标的方法,但是我开始考虑更简洁的方法,这似乎很困难。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。