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

233
Views
Seleccione un valor individual además del rango en la cláusula group by

Mi mesa se ve así

 id | job_id | measurement_id | value | timestamp --------+----------+------------------+------------------+----------- 1 | myJobId | myMeasurementId | 55.6111297607422 | 49212 2 | myJobId | myMeasurementId | 55.6607780456543 | 49412

Me gustaría obtener el valor máximo en ciertos intervalos de tiempo, sin embargo, también necesito la marca de tiempo asociada con la medición individual.

 range | max | timestamp ----------+---------------------+------------------ 0 | 68.7833782357044665 | 20535552 377613 | 67.9283221509389440 | 20535552 755226 | 67.2932168855194184 | 20535552

Intenté la siguiente declaración pero me encontré con un error

 select (timestamp/377613)*377613 as range, max(value), timestamp from measurements where job_id = 'myJobId' and measurement_id = 'myMeasurementId' group by timestamp/377613 order by 1; ERROR: column "measurements.timestamp" must appear in the GROUP BY clause or be used in an aggregate function

Sin la segunda marca de tiempo, la declaración funciona bien, pero, por supuesto, no entrega la marca de tiempo asociada con el valor máximo. ¿Cómo puedo obtener ese valor?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Puedes usar row_number()

 select * from ( select (timestamp/377613)*377613 as range, value, timestamp, row_number() over(partition by (timestamp/377613)*377613 order by value desc) as rn from measurements where job_id = 'myJobId' and measurement_id = 'myMeasurementId' )A when rn=1
over 4 years ago · Santiago Trujillo Report

0

En Postgres, debe usar distinct on para esta operación. Para mayor comodidad, también puede calcular el rango utilizando una unión lateral:

 select distinct on (v.range) v.range, m.value), m.timestamp from measurements m cross join lateral (values (m.timestamp/377613) * 377613)) as range where m.job_id = 'myJobId' and m.measurement_id = 'myMeasurementId' order by v.range, m.timestamp;

distinct on es una extensión de Postgres, pero resulta ser bastante útil. Ordena los datos y elige la primera fila que encuentra para cada valor en la cláusula distinct on .

En general, distinct on es más rápido que la consulta correspondiente usando funciones de ventana.

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