Mi consulta sigue esta estructura:
WITH CTE AS ( SELECT t1.x, COUNT(t1.y) AS count FROM table1 t1 GROUP BY t1.x ) SELECT CTE.x, CTE.count AS newCount, t2.count AS oldCount FROM table2 t2 JOIN CTE ON t2.x = CTE.x WHERE t2.count != CTE.count; Me sale el siguiente error: [42803] ERROR: aggregate functions are not allowed in WHERE
Parece que CTE.count es el agregado que desencadena este error. ¿No se supone que los CTE se calculan antes de la consulta principal? ¿Cómo reescribir la consulta para evitar esto?
PostgreSQL 13.2 en x86_64-pc-linux-gnu, compilado por gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5), 64 bits
Parece que es el "t2.count" lo que causa el problema.
En dbfiddle puedo reproducir el problema SOLAMENTE cuando no hay una columna llamada "recuento" en la tabla 2.
En otras palabras, el error ocurre solo cuando la tabla 2 se define así:
create table table2 (x int, y int);Sin embargo, si agregué la columna "recuento", el error desapareció
create table table2 (x int, y int, count int);Creo que cuando no existe tal columna, postgres maneja "contar" como una función agregada y arroja el error.
Entonces, mi solución sería verificar si dicha columna está presente y nunca usar palabras clave conservadas como nombres de columna
El t2.count se interpreta como una función COUNT() agregada , y su tabla t2 no tiene una columna llamada count .
Asegúrese de que su tabla realmente tenga una columna de count , o asegúrese de calcular su conteo agregado en otro CTE antes de unirse, y luego compare los resultados. También evite usar el alias "count", como el siguiente:
WITH CTE AS ( SELECT t1.x, COUNT(t1.y) AS total FROM table1 t1 GROUP BY t1.x ), CTE2 AS ( SELECT t2.x, COUNT(t2.y) AS total FROM table2 t2 GROUP BY t2.x ) SELECT CTE1.x, CTE1.total AS newCount, CTE2.total AS oldCount FROM CTE2 JOIN CTE1 ON CTE2.x = CTE1.x WHERE CTE2.total != CTE1.total;