Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

251
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!