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

191
Visualizações
Seleccione la entrada más reciente para cada usuario sin usar el grupo por (postgres)

Tengo una tabla myTable con cuatro columnas:

 id UUID, user_id UUID , text VARCHAR , date TIMESTAMP

( id es la clave principal y user_id no es único en esta tabla)

Quiero recuperar los user_id de usuario ordenados por su entrada más reciente, lo que estoy haciendo actualmente con esta consulta:

 SELECT user_id FROM myTable GROUP BY user_id ORDER BY MAX(date) DESC

El problema es que GROUP BY lleva mucho tiempo. ¿Hay una manera más rápida de lograr esto? Intenté usar una función de ventana con PARTITION BY como se describe aquí Recuperando el último registro en cada grupo - MySQL , pero realmente no aceleró las cosas. También me aseguré de que user_id esté indexado.

Mi versión de postgres es 10.4

Editar: la consulta anterior que estoy usando actualmente es funcionalmente correcta, el problema es que es lenta.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Su consulta parece un enfoque relevante para su requisito:

 select user_id from mytable group by user_id order by max(date) desc

Recomendaría un índice en (user, date desc) para acelerar las cosas. Tiene que ser un solo índice en ambas columnas.

También puede intentar distinct on , que podría , o no, brindarle un mejor rendimiento:

 select user_id from ( select distinct on(user_id) user_id, date from mytable order by user_id, date desc ) t order by date desc
over 4 years ago · Santiago Trujillo Relatório

0

Comience con un índice en user_id, date desc . Eso podría ayudar.

También puede intentar filtrar, una vez que tenga dicho índice:

 select t.user_id from myTable t where t.date = (select max(t2.date) from myTable t2 where t2.user_id = t.user_id ) order by t.date desc

Sin embargo, es posible que el order by termine tomando casi tanto tiempo como el group by .

Esta versión definitivamente usará el índice para la subconsulta:

 select user_id from (select distinct on (user_id) user_id, date from myTable t order by user_id, date desc ) t order by date desc;
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