我有一个庞大的MySQL表,由三列组成,如下所示
DATETIME | UNITID | VALUE
----------------------------------
2017-01-01 00:00 | A | 50
2017-01-01 00:00 | B | 54
2017-01-01 00:00 | C | 12
2017-01-01 00:05 | A | 9
2017-01-01 00:05 | B | 8
2017-01-01 00:05 | C | 55
2017-01-01 00:10 | A | 12
以DATETIME
和UNITID
作为INDEX。
该表的总长度为3300万行,包括~4年的数据和~300个单位ID
我要做的是通过UNITID
的组来聚合它,例如
DATETIME | VALUE(AB) | VALUE(C)
----------------------------------------
2017-01-01 00:00 | 104 | 12
2017-01-01 00:05 | 17 | 55
2017-01-01 00:10 | 12 | Null
我已经能够创建一个查询来执行此操作,如下所示
SELECT DISTINCT
T1.DATETIME AS DATETIME,
(SELECT
SUM(VALUE)
FROM
tbl_name AS T2
WHERE
T2.DATETIME= T1.DATETIME
AND T2.UNITID IN ('A', 'B')) AS VALUE(AB),
(SELECT
SUM(VALUE)
FROM
tbl_name AS T3
WHERE
T3.DATETIME= T1.DATETIME
AND T3.UNITID IN ('C')) AS VALUE(C)
FROM
tbl_name AS T1
WHERE
DATETIME >= '2017-01-01'
AND DATETIME <= '2017-01-02 23:55'
我实际上有大约10组UNITID,我将其传递给查询,如果我在查询中包含LIMIT
,它就会成功运行。限制为100000行需要12秒才能获取,但取消限制它永远不会结束。我的SQL技能不是很好,我无法解决导致这种情况的原因。请注意,对于此查询,只有大约105000个不同的行
非常感谢任何帮助。
答案 0 :(得分:4)
您的查询可以简化为:
SELECT DATETIME,
SUM(CASE WHEN UNITID IN ('A', 'B') THEN VALUE ELSE 0 END) AS AB,
SUM(CASE WHEN UNITID = 'C' THEN VALUE ELSE 0 END) AS C
FROM tbl_name
WHERE DATETIME BETWEEN '2017-01-01'AND '2017-01-02 23:55'
GROUP BY DATETIME
无需使用相关子查询。您可以使用条件聚合获得相同的结果。