0

我在同一個表上有兩個不同的查詢。第一個是所述形式的 -結合SQL語句進行優化

SELECT MIN(A) AS MIN_A, MAX(B) AS MAX_B 
FROM myTable 
WHERE timeStamp > ? 
GROUP BY type; 

而另外一個:

SELECT SUM (CASE WHEN io > 0 THEN 1 ELSE 0 END) as io_cnt 
FROM (
    SELECT 
    (CASE WHEN SUM(io_ops) > 0 THEN 1 ELSE 0 END) as io 
    FROM myTable 
    WHERE timestamp > ? AND type = ? 
    GROUP BY id 
) t; 

而表具有列 - A,B,ID,時間戳,類型。 現在我調用來自java的第一個查詢,獲取結果集輸出並遍歷它,以針對在第一個查詢中返回的每個類型調用第二個查詢。

我需要第一個查詢的MIN(A),MAX(B)和第二個查詢的io計數。是否有可能在一個查詢中完成?我使用Amazon Redshift作爲我的數據庫。

回答

1

Redshift is pretty limited。它基於PostgreSQL 8.0.2,並且不支持許多新功能。這應該工作(未經測試):

SELECT t.type, min(min_a) AS min_a, max(max_b) AS max_b 
     ,count(io > 0 OR NULL) AS io_cnt 
FROM (
    SELECT type, min(a) as min_a, max(b) as max_b 
     ,sum(io_ops) AS io 
    FROM myTable 
    WHERE timestamp > ? 
    GROUP BY type, id 
    ) t 
GROUP BY t.type; 

根據數據的分佈,這可能會更快與否:

SELECT t.type, m.min_a, m.max_b, count(io > 0 OR NULL) AS io_cnt 
FROM (
    SELECT type, sum(io_ops) AS io 
    FROM myTable 
    WHERE timestamp > ? 
    GROUP BY type, id 
    ) t 
JOIN (
    SELECT type, min(a) as min_a, max(b) as max_b 
    FROM myTable 
    WHERE timeStamp > ? 
    GROUP BY type 
    ) m USING (type) 
GROUP BY t.type, m.min_a, m.max_b; 
+0

第一個查詢看上去正是我想要的,非常感謝。 –