当前位置: 首页 > 知识库问答 >
问题:

根据Id的行排列和组合,不同组的总和作为SQL查询

陈业
2023-03-14

我需要根据不同组的Id进行行的排列和组合:作为SQL查询

CREATE TABLE TestTable2([Id] [int] NULL, [Group] [varchar](50) NULL, [PeriodStart] [varchar](50) NULL) ON [PRIMARY]

INSERT INTO TestTable2([Id], [Group], [PeriodStart]) VALUES (1, 'Group1', 'date1a')<br/>
INSERT INTO TestTable2([Id], [Group], [PeriodStart]) VALUES (1, 'Group1', 'date1b')<br/>
INSERT INTO TestTable2([Id], [Group], [PeriodStart]) VALUES (1, 'Group1', 'date1c')<br/>
INSERT INTO TestTable2([Id], [Group], [PeriodStart]) VALUES (1, 'Group2', 'date2a')<br/>
INSERT INTO TestTable2([Id], [Group], [PeriodStart]) VALUES (1, 'Group2', 'date2b')<br/>
INSERT INTO TestTable2([Id], [Group], [PeriodStart]) VALUES (1, 'Group3', 'date3a')<br/>
INSERT INTO TestTable2([Id], [Group], [PeriodStart]) VALUES (1, 'Group3', 'date3b')<br/>
INSERT INTO TestTable2([Id], [Group], [PeriodStart]) VALUES (1, 'Group3', 'date3c')<br/>

表中数据:

**Id -- Group -- PeriodStart**<br/>
1 -- Group1 -- date1a<br/>
1 -- Group1 -- date1b<br/>
1 -- Group1 -- date1c<br/>
1 -- Group2 -- date2a<br/>
1 -- Group2 -- date2b<br/>
1 -- Group3 -- date3a<br/>
1 -- Group3 -- date3b<br/>
1 -- Group3 -- date3c<br/>

注意:可以有任意数量的组,周期开始是一个日期时间

所需输出为:应为来自3*2*3个不同组行的18个组合(即此处为组1、组2和组3),其最大周期开始日期为:

**Id -- MaximumPeriodStartDate**<br/>
1 -- MAX OF (date1a, date2a, date3a)<br/>
1 -- MAX OF (date1a, date2b, date3a)<br/>
1 -- MAX OF (date1a, date2a, date3b)<br/>
1 -- MAX OF (date1a, date2b, date3b)<br/>
1 -- MAX OF (date1a, date2a, date3c)<br/>
1 -- MAX OF (date1a, date2b, date3c)<br/>

1 -- MAX OF (date1b, date2a, date3a)<br/>
1 -- MAX OF (date1b, date2b, date3a)<br/>
1 -- MAX OF (date1b, date2a, date3b)<br/>
1 -- MAX OF (date1b, date2b, date3b)<br/>
1 -- MAX OF (date1b, date2a, date3c)<br/>
1 -- MAX OF (date1b, date2b, date3c)<br/>

1 -- MAX OF (date1c, date2a, date3a)<br/>
1 -- MAX OF (date1c, date2b, date3a)<br/>
1 -- MAX OF (date1c, date2a, date3b)<br/>
1 -- MAX OF (date1c, date2b, date3b)<br/>
1 -- MAX OF (date1c, date2a, date3c)<br/>
1 -- MAX OF (date1c, date2b, date3c)<br/>

共有2个答案

宗安宁
2023-03-14

我将变量重命名为在大多数数据库中不是保留关键字的内容:

select t1.id, t2.id, t3.id, t1.ValStr+'+'+t2.ValStr+'+'+t3.ValStr
from @TestTable2 t1 join
     @TestTable2 t2
     on t1.TheGroup < t2.TheGroup  join
     @TestTable2 t3
     on  t2.TheGroup < t3.TheGroup 

我使用SQL Server语法进行字符串连接,因为看起来您正在使用该数据库。

我不能很容易地想出一种方法来处理SQL查询中的任何数量的组。但是,您可以使用以下内容处理“最多”数量的组:

select t1.id, t2.id, t3.id,
       stuff((coalesce('+'+t1.ValStr), '')+coalesce('+'+t2.ValStr, '') +
              coalesce('+'+t3.ValStr, '')+ . . .
             ), 1, 1, '')
from @TestTable2 t1 left outer join
     @TestTable2 t2
     on t1.TheGroup < t2.TheGroup left outer join
     @TestTable2 t3
     on  t2.TheGroup < t3.TheGroup . . 

您可以将左外连接继续到最大组数,并相应地修复select子句。

结果与您想要的有点不同。这会产生最多n个组的所有组合,而不是正好n个组。所以第一个会产生:(3 2 3)[1的组合](3 * 2 2 * 3 3 * 3)[2的组合](3*2*3)。您可以通过使用这个相当麻烦的where子句来解决这个问题:

where ((case when t1.thegroup is not null then 1 else 0 end)+
       (case when t2.thegroup is not null then 1 else 0 end)+
       (case when t3.thegroup is not null then 1 else 0 end)+
       . . .
      ) = (select count(distinct thegroup) from @TestTable2)

如果您的组是按顺序编号的,没有空格,您也可以这样写:

select t1.id, t2.id, t3.id,
       stuff((coalesce('+'+t1.ValStr), '')+coalesce('+'+t2.ValStr, '') +
              coalesce('+'+t3.ValStr, '')+ . . .
             ), 1, 1, '')
from @TestTable2 t1 left outer join
     @TestTable2 t2
     on t2.TheGroup = t1.TheGroup+1 left outer join
     @TestTable2 t3
     on t3.TheGroup = t2.TheGroup+1 . . .
where t1.TheGroup = 1

实际上,即使您的组没有按顺序编号,您也可以使用dense\u rank()进行安排,然后从那里开始:

with t as (
      select t.*, dense_rank() over (order by [Group]) as TheGroup
      from @TestTable2
     )
select t1.id, t2.id, t3.id,
       stuff((coalesce('+'+t1.ValStr), '')+coalesce('+'+t2.ValStr, '') +
              coalesce('+'+t3.ValStr, '')+ . . .
             ), 1, 1, '')
from t t1 left outer join
     t t2
     on t2.TheGroup = t1.TheGroup+1 left outer join
     t t3
     on t3.TheGroup = t2.TheGroup+1 . . .
where t1.TheGroup = 1

另一种方法是使用递归连接时序分类。如果没有这一点,这可能是最好的纯SQL方法。

秦俊友
2023-03-14

看看这个SQL小提琴。

SELECT SQ1.[ID]
        ,SQ1.[VALUE]+'+'+SQ2.[VALUE]+'+'+SQ3.[VALUE] AS COMBOS
FROM
(
SELECT [id],[VALUE]
FROM TESTTABLE2
WHERE [GROUP] = 1
) SQ1
INNER JOIN
(
SELECT [id],[VALUE]
FROM TESTTABLE2
WHERE [GROUP] = 2
) SQ2
ON SQ1.[ID]= SQ2.[ID]
INNER JOIN
(
SELECT [id],[VALUE]
FROM TESTTABLE2
WHERE [GROUP] = 3
) SQ3
ON SQ1.[ID]= SQ3.[ID]
 类似资料:
  • pojo类 jsp页面 输出: 我试图在hql中使用group by方法从数据库中获取单个数据,但查询执行成功,并且在相应的网页上也没有显示上述代码中的问题,以及如何在Hibernate和Spring Mvc应用程序中使用group by,并告知映射有何错误。

  • 大家好,我对C编码很陌生,但我正在学习这门课程。 我想写一段代码,找出数组中r个元素的组合,然后对结果进行置换。 我已经能够从各种来源进行研究,并有单独的代码,将打印组合和排列的数组。 我面临的挑战是如何将两个代码结合起来并使其作为一个整体工作。 第一个代码用于 5 个元素数组的组合,其中一次选择 4 个元素。 第二个代码是排列数组组合(前一个代码)的每个结果,这意味着4个元素的排列。在下面的这段

  • 我试图从黑莓的本机日历中读取“day”值,该值以整数形式返回,并映射到一周中每一天的值。这些值如下所示: 周一:32768 星期二:16384 周三:8192 周四:4096 周五:2048 sat:1024 孙:65536 如果事件发生在一天内,我可以看到值是否为mon/tue/we/thu/fri/sat/sun 值也与星期一值相同。 现在的问题是,如果事件发生在两天或三天以上 返回所选天数的

  • 我正试图创建一个产品清单使用谷歌表。每种类型的产品都有许多属性(或变体),这些属性组合在一起可以创建单个产品。 例如,有 直径:1/4英寸、1/2英寸、3/4英寸等。 长度:1/2英寸、1英寸、1/2英寸等 材料:钢、不锈钢 等等 特定产品是这些变化的特定组合。例如: 1/4英寸X 1/2英寸钢制圆头方颈螺栓 我要做的是创建一系列只包含属性的列。因此,直径柱、长度柱、材料柱等。 然后,我想通过将这

  • 问题内容: 在Oracle上是否有一种简单的方法来查询n个字段的唯一组合。我有一个非常简单的两场解决方案: 查询唯一组合: 通过此查询,可以认为1,2和2,1相同。不幸的是,它不适用于三字段结构(例如,必须将1,2,3视为与3,1,2相同,因为值的顺序无关紧要)。Oracle分析功能是否为该问题提供适当的解决方案?您能建议一些特定的Oracle分析功能吗? 问题答案: 您对2列的查询可以这样重写:

  • 问题内容: 我在尝试为此表定义SQL查询时遇到了麻烦: 有一张患者表格,其访问时记录的体重读数包括以下几列: 患者编号 体重读数 访问ID(每次访问一个) 换句话说,如果在两个记录中两个访问ID相同,则在相同的访问日期读取了两个权重。 我有这个查询来“让所有至少有两个体重读数高于150的患者”: 这是我的问题:如果我想修改此查询以便查询以下内容,该怎么办: “让所有患者在不同的访问中至少有两个体重