范围—如何根据外观将数据分组到mysql中的预设存储桶中

qvsjd97n  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(322)

图1
嗨,我如何根据外观将数据分组到mysql中的预设存储桶中?假设我的外观如图1所示,我需要如图2所示的输出(范围值是预先设定的)谢谢
,图2
图3

zsohkypk

zsohkypk1#

您可以通过定义范围的第二个表来解决这个问题,然后在 GROUP BY 查询。步骤如下:
创建一个包含范围的新表
开发用于对原始数据进行计数和分组的查询
运行 JOIN 对新的ranges表进行查询,以确定将计数放在哪个bucket中。
为范围创建和填充新表将很容易(尽量避免使用名称“range”,因为它是一个关键字):

  1. CREATE TABLE sections
  2. (
  3. id INT AUTO_INCREMENT PRIMARY KEY,
  4. name VARCHAR(50),
  5. start INT,
  6. end INT
  7. );

用你的部分填写:

  1. INSERT INTO sections(name, start, end) VALUES ('0-2', 0, 2);
  2. [...]
  3. INSERT INTO sections(name, start, end) VALUES ('11+', 11, 1<<31);

创建查询以对数据进行分组和计数。本例使用一个名为“events”的表,其中包含“catid”和“timestamp”列:

  1. SELECT
  2. COUNT(*) as eventCount
  3. FROM
  4. events
  5. GROUP BY
  6. catId

这可能会产生如下结果(仅使用了5个不同的cat ID):

  1. +------------+
  2. | eventCount |
  3. +------------+
  4. | 3 |
  5. | 3 |
  6. | 5 |
  7. | 1 |
  8. | 1 |
  9. +------------+

现在需要将此结果与 sections 使用 ON 条件。出于教学目的,中间(但不工作)查询将如下所示:

  1. SELECT
  2. s.id,
  3. s.name,
  4. s.start,
  5. s.end,
  6. COUNT(*) AS sectionCount
  7. FROM
  8. sections s
  9. JOIN
  10. (__your_previous_result_here__) e
  11. ON
  12. e.eventCount BETWEEN s.start AND s.end
  13. GROUP BY
  14. s.id

您的总查询如下所示:

  1. SELECT
  2. s.id,
  3. s.name,
  4. s.start,
  5. s.end,
  6. COUNT(*) AS sectionCount
  7. FROM
  8. sections s
  9. JOIN
  10. (SELECT
  11. COUNT(*) as eventCount
  12. FROM
  13. events
  14. GROUP BY
  15. catId) e
  16. ON
  17. e.eventCount BETWEEN s.start AND s.end
  18. GROUP BY
  19. s.id

请注意别名 s 以及 e 在这里使用。根据输入数据,结果如下所示:

  1. +----+------+-------+------------+--------------+
  2. | id | name | start | end | sectionCount |
  3. +----+------+-------+------------+--------------+
  4. | 1 | 0-1 | 0 | 1 | 2 |
  5. | 2 | 2-4 | 2 | 4 | 2 |
  6. | 3 | 5++ | 5 | 2147483647 | 1 |
  7. +----+------+-------+------------+--------------+
展开查看全部

相关问题