PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Efeito inesperado de filtragem no resultado da consulta crosstab()


extra1, extra2, ... são "colunas extras" na terminologia de crosstab.
O manual para o módulo tablefunc explica as regras:

E mais abaixo:

Ênfase em negrito em partes-chave por mim.

Você só classifica por row_name :
ORDER  BY row_name ASC

Não importa no primeiro exemplo em que você filtra com:
WHERE ... t.extra1 = 'val1'  -- single quotes by me

Todas as linhas de entrada têm extra1 = 'val1' de qualquer forma. Mas é importante no segundo exemplo em que você filtra com:
WHERE ... t.extra1 IN('val1', ...) --> More values

Agora, o primeiro requisito em negrito acima foi violado para a coluna extra extra1 . Embora a ordem de classificação da primeira consulta de entrada não seja determinística, os valores resultantes para a coluna "extra" extra1 são escolhidos arbitrariamente. Os valores mais possíveis para extra1 , menos linhas acabarão tendo 'val1':foi isso que você observou.

Você ainda pode fazê-lo funcionar:para reportar extra1 = 'val1' para cada row_name que tenha pelo menos um desses, altere o ORDER BY para:
ORDER  BY row_name, (extra1 <> 'val1')

Classifica 'val1' no topo. Explicação para esse boolean expressão (com links para mais):

Outras colunas "extras" ainda são escolhidas arbitrariamente enquanto a ordem de classificação não é determinística.

Noções básicas de crosstab: