PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Nieoczekiwany wpływ filtrowania na wynik zapytania crosstab()

extra1, extra2, ... to "dodatkowe kolumny" w terminologii crosstab.
Podręcznik modułu tablefunc wyjaśnia zasady:

I dalej w dół:

Odważny nacisk na kluczowe części przeze mnie.

Sortujesz tylko według row_name :

ORDER  BY row_name ASC

Nie ma znaczenia w pierwszym przykładzie, gdzie filtrujesz za pomocą:

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

Wszystkie wiersze wejściowe mają extra1 = 'val1' w każdym razie. Ale ma to znaczenie w drugim przykładzie, w którym filtrujesz za pomocą:

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

Teraz pierwszy pogrubiony wymóg powyżej jest naruszony dla dodatkowej kolumny extra1 . Chociaż porządek sortowania pierwszego zapytania wejściowego nie jest deterministyczny, wynikowe wartości kolumny „extra” extra1 są wybierane arbitralnie. Więcej możliwych wartości dla extra1 , mniej wierszy będzie miało „wartość1”:to właśnie zaobserwowałeś.

Nadal możesz sprawić, by to działało:zgłosić extra1 = 'val1' dla każdego row_name który ma co najmniej jeden z nich, zmień ORDER BY do:

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

Sortuje 'val1' na górze. Wyjaśnienie dla tego boolean wyrażenie (z linkami do innych):

Inne „dodatkowe” kolumny są nadal wybierane arbitralnie, podczas gdy porządek sortowania nie jest deterministyczny.

Podstawy tabeli krzyżowej:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz indeks w polu json w PostgreSQL 9.2

  2. Grupuj według miesiąca, zwróć 0, jeśli nie znaleziono rekordu

  3. django nie może połączyć się z RDS postgresql

  4. Użyj pola ograniczającego z PostGIS w waniliowym zapytaniu Postgres

  5. PostgreSQL:serial a tożsamość