2017-06-29 23 views
2

を終了決して私は3つの列からなる大規模なMySQLのテーブルをインデックスとして以下の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のように構造化されています。

テーブルの合計の長さがあって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' 

私は実際にUNITIDの私は、クエリに渡すと、私はLIMITが含まれている場合、それが正常に動作することの周りに10基を有していても、以下のようにこれを行うには、クエリを作成することができましたクエリの例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

関連する問題