MySQL聚合列不同条件查询永远不会结束

时间:2017-06-29 06:04:24

标签: mysql sql

我有一个庞大的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

DATETIMEUNITID作为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个不同的行

非常感谢任何帮助。

1 个答案:

答案 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

无需使用相关子查询。您可以使用条件聚合获得相同的结果。

Demo here