PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Unerwartete Auswirkung der Filterung auf das Ergebnis der crosstab()-Abfrage

extra1, extra2, ... sind "zusätzliche Spalten" in Kreuztabellen-Terminologie.
Das Handbuch für das Modul tablefunc erklärt die Regeln:

Und weiter unten:

Fette Hervorhebung wichtiger Teile von mir.

Sie sortieren nur nach row_name :

ORDER  BY row_name ASC

Im ersten Beispiel spielt es keine Rolle, wo Sie filtern mit:

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

Alle Eingabezeilen haben extra1 = 'val1' ohnehin. Aber im zweiten Beispiel ist es wichtig, wo Sie filtern mit:

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

Jetzt wird die erste fettgedruckte Anforderung oben für die zusätzliche Spalte extra1 verletzt . Während die Sortierreihenfolge der ersten Eingabeabfrage nicht deterministisch ist, ergeben sich Werte für die "extra"-Spalte extra1 werden willkürlich ausgewählt. Je mehr mögliche Werte für extra1 , je weniger Zeilen am Ende 'val1' haben:das haben Sie beobachtet.

Sie können es trotzdem zum Laufen bringen:extra1 = 'val1' melden für jeden row_name das mindestens eines davon hat, ändern Sie den ORDER BY zu:

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

Sortiert 'val1' oben. Erklärung für diesen boolean Ausdruck (mit Links zu weiteren):

Andere "zusätzliche" Spalten werden immer noch willkürlich gewählt, während die Sortierreihenfolge nicht deterministisch ist.

Kreuztabellengrundlagen: