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

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

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 Report

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