Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

247
Vistas
Cómo SELECCIONAR cada fila que tiene un valor duplicado de un campo

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.com

Y 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;
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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;
over 4 years ago · Santiago Trujillo Denunciar

0

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
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda