2017-06-29 65 views
2

我有結構類似於下面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作爲索引大MySQL表由三列。

表中的總長度爲33萬行,其包括〜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個不同的行

任何幫助非常感謝。

回答

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

相關問題