/ / Posso ottenere l'effetto delle funzioni di aggregazione nidificate senza un'altra query? - sql, postgresql, group-by, funzioni finestra

Posso ottenere l'effetto delle funzioni di aggregazione nidificate senza un'altra query? - sql, postgresql, group-by, funzioni finestra

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 № 1

Fondamentalmente, 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.