oskarsMedlem sedan nov. 20051 263 inlägg
Hej på er!
Jag har en tabell som innehåller en massa temperaturmätningar för olika analysprojekt.
Kolumnnamn: Sensor (INT)
Värde: 4250 (Alltså 42.5 C)
Ett analysprojekt kan innehålla mer än 15.000st temperatur-registreringar. Därför blir det lite tungt att loopa ut varenda rad när man ska skapa t.ex ett jQuery-diagram. Det jag gjort hittills är att t.ex loopa ut var 10:e rad, men jag gillar inte riktigt tanken på att eventuell viktig data missas då.
Så det jag undrar är:
Kan jag göra en SQL-fråga som bara väljer ut temperaturskillnader som är inom rimliga förändringar? Typ att "Välj bara värden som t.ex är -+0.5 C (alltså 0050) från raden innan... Har svårt att förklara bättre.
Exempel:
4250
4251 <- Bort
4253 <- Bort
4220
Hoppas någon kan hjälpa mig :)
/ O
nitro2k01Medlem sedan aug. 20037 630 inlägg
Förutsatt att det inte finns några gap i id-koiumnen så borde något sådant funka. Dvs, joina in nästa rad, och ta bara med resultatet om skillnaden mellan en rad och nästa rad är större än 50.
SELECT t1.*, t2.* FROM templog t1
JOIN templog t2 ON t2.id = t1.id + 1
WHERE ABS(t1.temp - t2.temp) > 50
ORDER BY t1.id
Sedan skulle jag eventuellt vilja göra andra sökningar, där du även kollar ökningen över lite längre tid. Denna fråga missar ju en konstant ökning när temperaturen ökar precis 0.5 grader mellan varje mätpunkt.
oskarsMedlem sedan nov. 20051 263 inlägg
Tack :D Inte testat än, men den ser bra ut.
Angående att man skulle missa om det är 0.5 C ökning mellan varje mätpunkt... Skulle ju fungera att i så fall bara sänka till t.ex 0.25 C, eller hur? Fast iofs får man med fler resultat då vilket segar ner, men å andra sidan blir det ju mer korrekt.
Ser inte hur man skulle kunna göra en bredare sökning... Där tar min hjärna slut.
EDIT: Fast nu kom jag ju på att detta blir helt fel. Om temperaturen varit relativt konstant under flera timmar så kommer ju denna funktionen bara visa typ första värdet... och hoppa över resten eftersom dom är inom godkänt intervall typ.
Det jag vill är ju att rensa bort "likadana" mätningar men samtidigt behålla några av dom så man får med alla klockslagen.... hm... Har du nån idé?
The_HulkMedlem sedan juni 20031 937 inlägg
Det kanske går att summera/gruppera värdena över en vissa tid. t.ex så man får ut min-, max- och medelvärden var 10:e minut? Skulle något i den stilen fungera?
aasahMedlem sedan mars 20033 451 inlägg
oskars skrev:
Det jag vill är ju att rensa bort "likadana" mätningar men samtidigt behålla några av dom så man får med alla klockslagen.... hm... Har du nån idé?
Sparar du klockslagen då? De syns inte i din tabellstruktur ovan. Vad har du för kolumner?
oskarsMedlem sedan nov. 20051 263 inlägg
Hej på er. Mja jag har fortfarande inte riktigt löst det… Eller snarare… Det finns vissa grejer som gör att det inte blir så lätt.
nitro's lösning fungerar just nu, men sen kommer inte alla ID:n vara i en följd utan kommer blandas med andra projekt.
The_Hulk, ja absolut det skulle fungera! Men jag kan inte göra en sån fråga. Skulle du vilja visa? :)
aasah, jepp, sparar alla temp-registreringar med ÅÅÅÅ-MM-DD HH:MM:SS
[ID] [Projekt_ID] [Temperatur] [Tidpunkt]
oskarsMedlem sedan nov. 20051 263 inlägg
Nu har jag faktiskt kommit fram till detta som summerar och räknar ut snitt-temperaturen varje timma.
Hur skulle man kunna justera denna frågan för att få fram snittet från varje halvtimma istället? :)
SELECT Projektnamn,
DATE_FORMAT(Skapad, '%Y-%m-%d %H:%i:%s') AS s,
(SUM(Temperatur)/count(Temperatur)) AS t,
FROM tblTemperaturer
WHERE Projektnamn = '$myProject'
GROUP BY Projekt, DATE_FORMAT(Skapad, '%Y-%m-%d %H')
Peter SMedlem sedan dec. 20025 484 inlägg
select projektnamn
, date_format(skapad, '%Y-%m-%d %H:%i:%s') as s
, avg(temperatur) as t
from tbltemperaturer
where projektnamn = '$myProject'
group
by projekt
, case when minute(skapad) between 0 and 29
then date_format(skapad, '%Y-%m-%d %H:00')
else date_format(skapad, '%Y-%m-%d %H:30')
end