質問

同じテーブルに2つの異なるクエリがあります。最初のものは形式です -

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から最初のクエリを呼び出し、最初のクエリで返されたすべての型の2番目のクエリを呼び出すために、ResultSetの出力をオンにしてループオーバーします。

私はmin(a)、max(b)の両方が必要です。1つのクエリで実行することは可能ですか?データベースとしてAmazon Redshiftを使用しています。

役に立ちましたか?

解決

Redshiftはかなり限られています。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;
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top