Usando PostgreSQL, estoy tratando de encontrar una manera de seleccionar cada fila que duplique valores para una determinada columna.
Por ejemplo, mi tabla se vería así:
id | username | email 1 | abc | abc@test.com 2 | abc1 | abc@test.com 3 | def | def@test.com 4 | ghi | ghi@test.com 5 | ghi1 | ghi@test.comY mi resultado deseado seleccionaría el nombre de usuario y el correo electrónico, donde el recuento de correo electrónico> 2:
abc | abc@test.com abc1 | abc@test.com ghi | ghi@test.com ghi1 | ghi@test.com Intenté group by having , y eso me acerca a lo que quiero, pero no creo que quiera usar group by porque eso combinará las filas con valores duplicados, todavía quiero mostrar las filas separadas que contienen valores duplicados.
SELECT email FROM auth_user GROUP BY email HAVING count(*) > 1;Eso solo me muestra los correos electrónicos que tienen valores duplicados:
abc@test.com ghi@test.com Puedo incluir el recuento allí con SELECT email, count(*) FROM ... pero eso tampoco es lo que quiero.
Estoy pensando que quiero algo como where count(email) > 1 pero eso me da un error que dice ERROR: aggregate functions are not allowed in WHERE
¿Cómo puedo seleccionar valores duplicados sin agruparlos?
Actualizar con solución :
@GordonLinoff publicó la respuesta correcta. Pero para satisfacer mis necesidades exactas de obtener solo los campos de nombre de usuario y correo electrónico, he modificado un poco el suyo (que debería explicarse por sí mismo, pero publicarlo en caso de que alguien más necesite la consulta exacta)
select username, email from (select username, email, count(*) over (partition by email) as cnt from auth_user au ) au where cnt > 1;Si desea todas las filas originales, sugeriría usar count(*) como una función de ventana:
select au.* from (select au.*, count(*) over (partition by email) as cnt from auth_user au ) au where cnt > 1;También puede encontrar esto útil:
select t1.*, t2.* from auth_user t1, auth_user t2 where t1.id != t2.id and t1.email = t2.email