sql >> Databáze >  >> RDS >> PostgreSQL

Neočekávaný účinek filtrování na výsledek dotazu crosstab().

extra1, extra2, ... jsou "sloupky navíc" v terminologii křížových tabulek.
Příručka pro modul tablefunc vysvětluje pravidla:

A dále:

Odvážný důraz na klíčové části mnou.

Třídíte pouze podle row_name :

ORDER  BY row_name ASC

V prvním příkladu nezáleží na tom, kde filtrujete pomocí:

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

Všechny vstupní řádky mají extra1 = 'val1' tak jako tak. Ale záleží na druhém příkladu, kde filtrujete pomocí:

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

Nyní je porušen první výše uvedený požadavek tučně pro další sloupec extra1 . Zatímco pořadí řazení prvního vstupního dotazu je nedeterministické, výsledné hodnoty pro sloupec "extra" extra1 jsou vybírány libovolně. Čím více možných hodnot pro extra1 , méně řádků bude mít 'val1':to jste si všimli.

Stále to může fungovat:nahlásit extra1 = 'val1' pro každý row_name který má alespoň jeden z nich, změňte ORDER BY komu:

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

Seřadí 'val1' nahoru. Vysvětlení pro tento boolean výraz (s odkazy na další):

Ostatní „extra“ sloupce jsou stále vybírány libovolně, zatímco pořadí řazení není deterministické.

Základy křížové tabulky:




  1. Import GeoLite2 od MaxMind do MySQL

  2. Je možné dotazovat se na konkrétní hodnotu ve sloupci odděleném čárkami?

  3. proč postgres dává souběžně aktualizovanou chybu řádku, když explicitně zamykám celou tabulku

  4. Jak Pi() funguje v PostgreSQL