Question

J'ai 2 requêtes différentes sur la même table.Le premier est de la forme -

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

et l'autre:

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;

et table a des colonnes - A, B, ID, Timetamp, Type. En ce moment, j'appelle la première requête de Java, prenez la sortie des résultatsset et en boucle pour appeler la deuxième requête pour chaque type renvoyé dans la première requête.

J'ai besoin à la fois de min (a), de max (b) des choses de première requête et de l'IO compte de la deuxième requête.Est-il possible de le faire dans une requête?J'utilise Amazon Redshift comme ma base de données.

Était-ce utile?

La solution

RedShift est assez limitée .Il est basé sur PostgreSQL 8.0.2 et de nombreuses nouvelles fonctionnalités ne sont pas prises en charge.Cela devrait fonctionner (non testé):

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;

Selon la distribution des données, cela peut être plus rapide ou non:

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;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top