当前位置: 首页 > 面试题库 >

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

游安康
2023-03-14
问题内容

我有一个奇怪的分组方案,并且在找出什么是在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,3),
('c',5,7,6),
('d',8,7,9),
('e',11,10,9),
('f',11,12,13),
('g',20,22,21),
('h',23,22,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

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


问题答案:

干得好:

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)



 类似资料:
  • 问题内容: 请帮我这个: 我想按列TestType分组,但如果它们具有相同的TestType,则应将Result拆分为colunms 我希望SQL以这种格式返回数据 Result#列应该是动态的,因为每个TestType都有很多结果 问题答案: 正如我在评论中所提到的,这里您需要的是或交叉标签;我更喜欢后者,所以我将要使用的东西。 对此的非动态解决方案如下: 但是,问题在于这会将您“锁定”到3个结

  • 问题内容: 这应该很简单,但是让我受益匪浅。 我所拥有的只是一个只有两列的表格,如下所示: 等等。 我想计算 每天 的 总字数 -我将它们按日期添加分组并选择WordCount的总和,最后得到语法错误(wordcount必须在group by子句中),但是现在我得到的天数为null 这是我的查询: 这只是选择null。我怎么知道怎么了? 谢谢。 问题答案: 如果您使用该怎么办: 我不明白您为什么还

  • 我用C++创建了一个简单的类Storer,用于内存分配。它包含六个字段变量,所有这些变量都在构造函数中赋值: 我对这些变量是如何存储的很感兴趣,所以我编写了以下代码: 我对输出非常感兴趣:

  • 我已经在Android Studio中编写了它,也在同一个项目中与Kotlin一起工作。这是我的java代码的错误列表(按照Android Studio扔给我的顺序): 无法解析符号“重写” 无法解析方法“在创建时(?)” 无法解析符号“Saved InstanceState” 无法解析方法“在创建时(?)” 无法解析符号“Saved InstanceState” 无法解析方法“Set Conte

  • 我有以下Apache Spark数据帧(DF1): 首先,我想按对DataFrame进行分组,将结果收集到中并接收新的DataFrame(DF2): 之后,我需要收集到通过分组,我将收到如下所示的新DataFrame(DF3): 所以,我有一个问题 - 首先,我可以在阿帕奇火花中使用按数组类型列分组吗?如果是这样,我可能会在 单个字段中result_list数千万个值。在这种情况下,阿帕奇火花是否

  • 问题内容: 给定这样的假设查询: 并有一个类似于下面的表格: 所需结果: 有什么方法可以使用GROUP BY和LIKE语句(LIKE“ silver”,LIKE“ gold”,LIKE“ platinum”等)对这些条目进行分组? 问题答案: 您可以使用: 某些数据库允许您在中使用列别名。