Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

254
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda