Combinando las declaraciones SQL para optimizar
-
20-12-2019 - |
Pregunta
Tengo 2 consultas diferentes en la misma mesa.El primero es del formulario -
SELECT MIN(A) AS MIN_A, MAX(B) AS MAX_B
FROM myTable
WHERE timeStamp > ?
GROUP BY type;
y el otro:
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;
y la tabla tiene columnas - A, B, ID, marca de tiempo, tipo. En este momento, llamo a la primera consulta de Java, tome la salida de los resultados y lo roque sobre él para llamar a la segunda consulta para cada tipo que se devolvió en la primera consulta.
Necesito tanto min (a), max (b) las cosas desde la primera consulta y el IO cuenta desde la segunda consulta.¿Es posible hacerlo en una consulta?Estoy usando Amazon RedSpift como mi base de datos.
Solución
redshift es bastante limitado .Se basa en PostgreSQL 8.0.2 y muchas características nuevas no son compatibles.Esto debería funcionar (no probado):
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;
Dependiendo de la distribución de datos, esto podría ser más rápido o no:
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;