用于基于值范围的任意分组的MySQL方法

时间:2019-02-13 21:33:27

标签: mysql

我有一个简单的数据集,其中有时间让脚本完成各个步骤。时间是不可预测的,但主要是在特定时间范围内进行分组,但是我想以十分之一秒为单位进行绘制。 (我知道这很奇怪,这是一些报表可视化内容的要求)。我可以将case语句延长得很长,但是我认为有更好的方法可以做到这一点。那是什么方法?

-1

2 个答案:

答案 0 :(得分:1)

您可以将范围放在临时表中。

CREATE TEMPORARY TABLE metric_ranges (
    low  NUMERIC(4,1) NOT NULL,
    high NUMERIC(4,1) NOT NULL,
    metric VARCHAR(10) NOT NULL,
    PRIMARY KEY (low, high),
    UNIQUE KEY (label)
);
INSERT INTO metric_ranges 
VALUES (0.0, 0.1, '0-0.1'),
       (0.1, 0.2, '0.1-0.2'),
       (0.2, 0.3, '0.2-0.3'),
       (0.3, 0.4, '0.3-0.4'),
       (0.4, 0.5, '0.4-0.5'),
       ...etc...

然后将您的数据加入范围:

SELECT COUNT(t.thing) AS value, m.metric
FROM (
    SELECT thing, 
         COALESCE(step1,0) +
         COALESCE(step2,0) +
         COALESCE(step3,0) +
         COALESCE(step4,0) +
         COALESCE(step5,0) +
         COALESCE(step6,0) +
         COALESCE(step7,0) AS total
    FROM mytable
) AS t
JOIN metric_ranges AS m ON t.total >= m.low AND t.total < m.high
GROUP BY m.metric

由您决定确保范围不重叠!

答案 1 :(得分:0)

如果某人有一个更有趣的答案,可以使事情变得更加任意(例如,它是一个int而不是float,或者可以随意设置bucket的大小),那么使用ROUND和group by列对我来说就足够了希望看到这一点并将其标记为答案。

SELECT
  COUNT(thing) AS value,
  ROUND(COALESCE(step1,0)+COALESCE(step2,0)+COALESCE(step3,0)+COALESCE(step4,0)+COALESCE(step5,0)+COALESCE(step6,0)+COALESCE(step7,0),1) AS metric
FROM table
GROUP BY metric