문제

동일한 테이블에 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;
.

및 테이블에는 columns - a, b, id, timestamp, type. 지금은 Java에서 첫 번째 쿼리를 호출하고 ResultSet 출력을 가져 와서 첫 번째 쿼리에서 리턴 된 모든 유형에 대해 두 번째 쿼리를 호출하여 루프를 루프합니다.

첫 번째 쿼리에서 최소한 (a), max (b) 것들을 모두 필요하며 두 번째 쿼리에서 IO가 계산됩니다.하나의 쿼리에서 할 수 있습니까?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