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

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

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

zsohkypk

zsohkypk1#

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

CREATE TABLE sections
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    start INT,
    end INT
);

用你的部分填写:

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

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

SELECT
    COUNT(*) as eventCount
FROM
    events
GROUP BY
    catId

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

+------------+
| eventCount |
+------------+
|          3 |
|          3 |
|          5 |
|          1 |
|          1 |
+------------+

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

SELECT
    s.id,
    s.name,
    s.start,
    s.end,
    COUNT(*) AS sectionCount
FROM
    sections s
JOIN
    (__your_previous_result_here__) e
ON
    e.eventCount BETWEEN s.start AND s.end
GROUP BY
    s.id

您的总查询如下所示:

SELECT
    s.id,
    s.name,
    s.start,
    s.end,
    COUNT(*) AS sectionCount
FROM
    sections s
JOIN
    (SELECT
         COUNT(*) as eventCount
     FROM
         events
     GROUP BY
         catId) e
ON
    e.eventCount BETWEEN s.start AND s.end
GROUP BY
    s.id

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

+----+------+-------+------------+--------------+
| id | name | start | end        | sectionCount |
+----+------+-------+------------+--------------+
|  1 | 0-1  |     0 |          1 |            2 |
|  2 | 2-4  |     2 |          4 |            2 |
|  3 | 5++  |     5 | 2147483647 |            1 |
+----+------+-------+------------+--------------+

相关问题