【问题标题】:How to group and concatenate several rows into groups of 20s如何将多行分组和连接成 20 组
【发布时间】:2012-06-04 05:32:21
【问题描述】:

我有一张只有数字 ID 的表格

ID
1
2
3
4
5
6
7
8
9
10

我想将这个 id 分解并连接(分组)成 5 或 20 的组,ej。

GROUPS
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15

如何使用 SQL 做到这一点?

更新:

带有排序 ID 的选择

  SELECT GROUP_CONCAT(id ORDER BY id) AS GROUPS
  FROM `test`
  GROUP BY (id - 1) DIV 5

结果:

  GROUPS
  1,2,3,4,5
  6,7,8,9,10
  11,12,13,14,15
  16,17,18,19,20
  21,22,23,24,25
  26,27,28,29,30
  31,32,33,34,35

选择第二个未排序的表

  SELECT GROUP_CONCAT(id ORDER BY id) AS GROUPS
  FROM `test2`
  GROUP BY (id - 1) DIV 5

结果:

  GROUPS
  3,5
  10
  12
  16
  23,24,25
  32,35
  43,44
  47
  55
  61
  68,70
  77
  84
  89
  91,92,95
  97,100

【问题讨论】:

  • 您使用的是哪个 RDBMS?您是否希望将这些值放在一个带有n ID 的列中,用逗号分隔?
  • ID 是否保证从 1 开始无间隙?
  • 第一个答案就像一个魅力,但只有当 id 被排序并且没有 id 丢失时,这不是我的情况:
  • 不,不能保证 id 没有间隙,我想必须有一种方法可以按项目的 count() 进行分组,或者在具有相关数字的 select 上创建一个额外的列.

标签: mysql sql group-by concatenation break


【解决方案1】:

对于未排序的 ID:

SET @rank=0;
SELECT
    id,
    @rank:=@rank+1 AS rank,
    GROUP_CONCAT(id ORDER BY id) AS GROUPS
FROM  `test2`
GROUP BY (@rank ) DIV 5

结果:

+----+------+----------------+
| id | rank | GROUPS         |
+----+------+----------------+
|  1 |    1 | 1,3,5,7,9      |
| 13 |    7 | 11,13,15,17,19 |
| 29 |   15 | 21,23,25,27,29 |
| 31 |   16 | 31,33,35,37,39 |
| 45 |   23 | 41,43,45,47,49 |
| 51 |   26 | 51,53,55,57,59 |
| 61 |   31 | 61,63,65,67,69 |
| 77 |   39 | 71,73,75,77,79 |
| 81 |   41 | 81,83,85,87,89 |
| 93 |   47 | 91,93,95,97,99 |
+----+------+----------------+

非常感谢您的帮助,没有您的帮助我无法知道!

【讨论】:

  • +1 是一个聪明但有点邪恶的解决方案。我认为这可能是在 MySQL 中执行此操作的最佳方式,因为 ROW_NUMBER 尚不支持。
  • 我真的不知道有没有其他办法,你给我一个很好的解决方案,然后我记得我可以添加一个相关编号的列,我听说Microsoft SQL是在某些方面更强大,我希望我能完成高中并学习计算机科学,我所知道的是我在互联网上学到的东西,例如英语,(我的母语是西班牙语),我所知道的就是思考并找到解决方案,一堆好技巧以及在哪里可以找到正确的答案,再次感谢您的帮助!
  • 您说得对,SQL Server 通常具有更多功能。例如,它确实具有您可以在此处使用的 ROW_NUMBER 函数。但是它没有GROUP_CONCAT 或任何类似的东西(使用FOR XML 有一个可怕的黑客攻击)。所以这两个数据库都不是解决这个问题的理想选择——你需要破解每个数据库中缺失的特性。
【解决方案2】:

对于 MySQL:

SELECT GROUP_CONCAT(id ORDER BY id) AS GROUPS
FROM yourtable
GROUP BY (id - 1) DIV 5

在线查看:sqlfiddle

【讨论】:

  • 如果 ID 按顺序排列,您的代码效果很好,如果不是,它不起作用,我通过添加一个连续的行计数器尝试使用此解决方案,但它的工作方式很奇怪: SET @rank=0;
    SELECT
    id,
    @rank:=@rank+1 AS rank,
    GROUP_CONCAT(id ORDER BY id) AS GROUPS
    FROM test2
    按演员分组(rank/5 已签名)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2013-01-29
  • 2011-04-20
  • 2019-10-26
  • 1970-01-01
  • 2012-09-15
相关资源
最近更新 更多