extra1, extra2, ...
son "columnas adicionales" en terminología de tabulación cruzada.
El manual del módulo tablefunc
explica las reglas:
Y más abajo:
Énfasis audaz en las partes clave por mí.
Solo ordena por row_name
:
ORDER BY row_name ASC
No importa en el primer ejemplo donde filtras con:
WHERE ... t.extra1 = 'val1' -- single quotes by me
Todas las filas de entrada tienen extra1 = 'val1'
de todos modos. Pero importa en el segundo ejemplo donde filtras con:
WHERE ... t.extra1 IN('val1', ...) --> More values
Ahora, el primer requisito en negrita anterior se viola para la columna adicional extra1
. Si bien el orden de clasificación de la primera consulta de entrada no es determinista, los valores resultantes para la columna "extra" extra1
son elegidos arbitrariamente. Los valores más posibles para extra1
, menos filas terminarán teniendo 'val1':eso es lo que observaste.
Todavía puede hacer que funcione:para informar extra1 = 'val1'
para cada row_name
que tiene al menos uno de esos, cambie el ORDER BY
a:
ORDER BY row_name, (extra1 <> 'val1')
Ordena 'val1' en la parte superior. Explicación para ese boolean
expresión (con enlaces a más):
Otras columnas "extra" todavía se eligen arbitrariamente mientras que el orden de clasificación no es determinista.
Conceptos básicos de tabulación cruzada:
- Consulta de tabulación cruzada de PostgreSQL
- Postgresql crosstab consulta con varias columnas de "nombre de fila"