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

Uventet effekt af filtrering på resultat fra crosstab()-forespørgsel

extra1, extra2, ... er "ekstra kolonner" i krydstabuleringsterminologi.
Manualen til tablefunc-modulet forklarer reglerne:

Og længere nede:

Fed vægt på nøgledele af mig.

Du sorterer kun efter row_name :

ORDER  BY row_name ASC

Det betyder ikke noget i det første eksempel, hvor du filtrerer med:

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

Alle inputrækker har extra1 = 'val1' alligevel. Men det betyder noget i det andet eksempel, hvor du filtrerer med:

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

Nu er det første krav med fed skrift ovenfor overtrådt for den ekstra kolonne extra1 . Mens sorteringsrækkefølgen for den første inputforespørgsel er ikke-deterministisk, resulterer de resulterende værdier for kolonnen "ekstra" extra1 er valgt vilkårligt. De flere mulige værdier for extra1 , jo færre rækker ender med at have 'val1':det er det, du har observeret.

Du kan stadig få det til at fungere:at rapportere extra1 = 'val1' for hver row_name der har mindst én af dem, skal du ændre ORDER BY til:

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

Sorterer 'val1' øverst. Forklaring på den boolean udtryk (med links til mere):

Andre "ekstra" kolonner vælges stadig vilkårligt, mens sorteringsrækkefølgen ikke er deterministisk.

Grundlæggende om krydstabeller:




  1. beregne regnskabsår i sql select erklæring?

  2. AWS Aurora-server reagerer nogle gange med ukendt database:...

  3. Sådan rettes "Partitionsskemaet '...' har ikke nogen næste brugt filgruppe" i SQL Server

  4. Google Cloud Dataflow brugerdefineret MySQL-kilde