您可以通过定义范围的第二个表来解决这个问题,然后在 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);
现在需要将此结果与 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
1条答案
按热度按时间zsohkypk1#
您可以通过定义范围的第二个表来解决这个问题,然后在
GROUP BY
查询。步骤如下:创建一个包含范围的新表
开发用于对原始数据进行计数和分组的查询
运行
JOIN
对新的ranges表进行查询,以确定将计数放在哪个bucket中。为范围创建和填充新表将很容易(尽量避免使用名称“range”,因为它是一个关键字):
用你的部分填写:
创建查询以对数据进行分组和计数。本例使用一个名为“events”的表,其中包含“catid”和“timestamp”列:
这可能会产生如下结果(仅使用了5个不同的cat ID):
现在需要将此结果与
sections
使用ON
条件。出于教学目的,中间(但不工作)查询将如下所示:您的总查询如下所示:
请注意别名
s
以及e
在这里使用。根据输入数据,结果如下所示: