Combinazione di dichiarazioni SQL per ottimizzare
-
20-12-2019 - |
Domanda
Ho 2 diverse query sullo stesso tavolo.Il primo è della forma -
SELECT MIN(A) AS MIN_A, MAX(B) AS MAX_B
FROM myTable
WHERE timeStamp > ?
GROUP BY type;
.
E l'altro:
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;
.
E la tabella ha colonne - A, B, ID, Timestamp, Tipo. In questo momento, chiamo la prima query da Java, prendi l'output dei risultati e loop su di esso per chiamare la seconda query per ogni tipo restituito in prima query.
Ho bisogno di entrambi i min (A), max (b) cose della prima query e IO conta dalla seconda query.È possibile farlo in una query?Sto usando Amazon Redshift come mio database.
Soluzione
redshift è piuttosto limitato .Si basa su PostgreSQL 8.0.2 e molte nuove funzionalità non sono supportate.Questo dovrebbe funzionare (non testato):
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;
.
A seconda della distribuzione dei dati, questo potrebbe essere più veloce o meno:
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;
. Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow