PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Effetto imprevisto del filtro sul risultato della query crosstab()

extra1, extra2, ... sono "colonne extra" nella terminologia dei campi incrociati.
Il manuale per il modulo tablefunc spiega le regole:

E più in basso:

Enfasi audace sulle parti chiave da parte mia.

Ordina solo per row_name :

ORDER  BY row_name ASC

Non importa nel primo esempio in cui filtri con:

WHERE ... t.extra1 = 'val1'  -- single quotes by me

Tutte le righe di input hanno extra1 = 'val1' comunque. Ma è importante nel secondo esempio in cui filtri con:

WHERE ... t.extra1 IN('val1', ...) --> More values

Ora, il primo requisito in grassetto sopra è violato per la colonna extra extra1 . Sebbene l'ordinamento della prima query di input non sia deterministico, i valori risultanti per la colonna "extra" extra1 vengono scelti arbitrariamente. Più valori possibili per extra1 , meno righe finiranno per avere 'val1':questo è quello che hai osservato.

Puoi ancora farlo funzionare:per segnalare extra1 = 'val1' per ogni row_name che ne ha almeno uno, cambia il ORDER BY a:

ORDER  BY row_name, (extra1 <> 'val1')

Ordina "val1" in alto. Spiegazione per quel boolean espressione (con collegamenti ad altri):

Altre colonne "extra" vengono comunque scelte arbitrariamente mentre l'ordinamento non è deterministico.

Nozioni di base sui campi incrociati: