Combinant des déclarations SQL pour optimiser
-
20-12-2019 - |
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.
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;