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

201
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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