Sida 1 av 1

SQL Hämta senaste värdena från olika id

Postat: 30 december 2021, 17:45:56
av LarryXz
Då det var flera år sedan jag höll på med SQL så känner jag att jag glömt en hel del.

Jag har en tabell som ser ut så här.

Kod: Markera allt

CREATE TABLE `temperature` (
  `sensor_id` bigint(18) NOT NULL,
  `reading_time` datetime NOT NULL,
  `temperature` decimal(10,2) NOT NULL
)
I den sparas temperatur från flera temperatursensor och varje sensor har ett eget id.
Det jag försöker göra är att hämta den senaste temperaturen från varje sensor.

Det närmsta jag har kommit är:

Kod: Markera allt

SELECT `sensor_id`, MAX(`reading_time`), `temperature` FROM temperature GROUP BY `sensor_id`;
Det funkar så långt som att jag har en rad för varje sensor med den senaste avläsningstiden, men temperaturvärdet är för en annan rad.
Någon som har koll på SQL och förstår vad jag menar?

Re: SQL Hämta senaste värdena från olika id

Postat: 30 december 2021, 17:53:36
av Norberg
Denna borde peka dig i rätt riktning https://stackoverflow.com/questions/453 ... iple-times

Re: SQL Hämta senaste värdena från olika id

Postat: 30 december 2021, 18:28:45
av davidi
Är en subselect ok?

Kod: Markera allt

select t1.sensor_id, t1.reading_time, t1.temperature from temperature t1
join (select sensor_id, max(reading_time) maxr from temperature group by sensor_id) t2
on t1.sensor_id = t2.sensor_id and t1.reading_time = t2.maxr;

Re: SQL Hämta senaste värdena från olika id

Postat: 30 december 2021, 21:59:36
av LarryXz
Tack så mycket båda två!
Hittade många inlägg på stackoverflow, men inget som passade mig. Men just den där hittade jag inte.
Nu funkar det som det ska.

Re: SQL Hämta senaste värdena från olika id

Postat: 30 december 2021, 22:27:59
av nifelheim
Jag skulle läsa ut värdet med med tidsintervall fram till nutid,
när tidpunktsvariabeln $d1 är nutid får jag sista loggade värdet,
vid historiska tidpunkter den avläsning som är närmast.

"dt" innehåller tid för rapporterat värde och "meter" innehåller värdet.

Kod: Markera allt

SELECT dt,meter
  FROM ${elmatdb[$i]}
  ORDER BY abs(TIMESTAMPDIFF(second, dt, "$d1"))
  LIMIT 1
Jag har ingen aning om vad som är minst "krävande" men det är inget script som körs ofta :)