Ho delle colonne a
, b
, c
in un tavolo table1
. Ho bisogno di una query come la seguente:
select func1(a), func2(b,func1(a)) from table1 group by c.
Attualmente sto memorizzando il risultato di func1(a)
in un CTE usando le funzioni della finestra e quindieseguendo il gruppo di cui sopra. Il piano di esecuzione mostra 2 aggregazioni in corso: una per l'aggregazione delle finestre e un'altra per l'aggregazione degli hash per il secondo gruppo. Dovrebbe essere logicamente possibile farlo con una singola aggregazione in un singolo passaggio.
Sto usando Postgres9.3. Ho provato a nidificare le funzioni della finestra e l'annidamento delle funzioni di aggregazione, ma ricevo l'errore che entrambe non sono possibili in Postgres.
In sostanza, vorrei che le aggregazioni di cui sopra fossero eseguite in un unico passaggio.
risposte:
0 per risposta № 1Fondamentalmente, si utilizza una sottoquery o CTE (come già accennato) per evitare la valutazione ripetuta di una funzione:
SELECT c, a1, func2(b,a1) AS ba1
FROM (SELECT c, func1(a) AS a1, b FROM table1) sub
GROUP BY c;
Esempio nel violino SQL
Sei consapevole che l'espressione può essere semplificata sum(a * b)
quando escluso errori di arrotondamento derivante dalla divisione di numeri interi?
Questo:
with temp_view as (
select (sum(a * b) over (partition by c) / sum(a) over (partition by c)) as func1_out, a, c
from test_table1
)
select sum(a * func1_out) AS f2
from temp_view
group by c;
è uguale a (eccetto per gli errori di arrotondamento):
SELECT sum(a * b) AS f2
FROM test_table1
GROUP BY c;
SQL Fiddle dimostrando la (non) differenza.