siDDis Skrevet 23. april 2006 Del Skrevet 23. april 2006 Eg skal kalkulere gjennomsnittstempratur frå dei 100 siste minutta. Men sliter med å få det til å gå rundt. Dette er eit eksempel som ikkje fungerer som viser kva eg vil. SELECT AVG(tempout) AS avgtemp FROM wdata WHERE wdata_id = ( SELECT wdata_id FROM wdata order by wdata_id Desc LIMIT 100); Lenke til kommentar
laaknor Skrevet 23. april 2006 Del Skrevet 23. april 2006 Øøøøø... Hvorfor gjøre det så avansert? SELECT AVG(tempout) AS avgtemp FROM wdata ORDER BY wdata_id LIMIT 100 Har du tidspunktet for når dataen ble lagret, så er vel det en bedre ORDER enn ID'en den blir lagt inn i, men det bestemmer du. Lenke til kommentar
siDDis Skrevet 23. april 2006 Forfatter Del Skrevet 23. april 2006 (endret) Då får eg ein feilmelding som seier at wdata id må være i ein GROUP BY clause. Og når eg bruker GROUP BY så får eg ikkje henta dei *rette* radene. Eg vil helst henda frå dei siste radene då det kjører i ein automatisk prosess. Tidspunkt er greit for enkle spørringer. Endret 23. april 2006 av siDDIs Lenke til kommentar
ofredstie Skrevet 23. april 2006 Del Skrevet 23. april 2006 Då får eg ein feilmelding som seier at wdata id må være i ein GROUP BY clause.Og når eg bruker GROUP BY så får eg ikkje henta dei *rette* radene. Eg vil helst henda frå dei siste radene då det kjører i ein automatisk prosess. Tidspunkt er greit for enkle spørringer. 5975610[/snapback] Kan jeg faa se hvordan du satte opp tabellene? Lenke til kommentar
siDDis Skrevet 23. april 2006 Forfatter Del Skrevet 23. april 2006 Det er ein tabell! CREATE TABLE wdata(tempout float) Lenke til kommentar
ofredstie Skrevet 24. april 2006 Del Skrevet 24. april 2006 Det er ein tabell! CREATE TABLE wdata(tempout float) 5976804[/snapback] Og den ene tabellen har kun ett felt!? SELECT AVG(tempout) AS avgtemp FROM wdata ORDER BY avgtemp DESC LIMIT 100 Lenke til kommentar
roac Skrevet 24. april 2006 Del Skrevet 24. april 2006 Det er ein tabell! CREATE TABLE wdata(tempout float) 5976804[/snapback] Og den ene tabellen har kun ett felt!? SELECT AVG(tempout) AS avgtemp FROM wdata ORDER BY avgtemp DESC LIMIT 100 5976899[/snapback] Nei nei, da får du gjennomsnittet av de 100 høyeste verdiene. Dette er en seriøs designfeil, for i en database kan du ikke garantere at dataene kommer ut i samme rekkefølge som de blir satt inn, så her er det umulig å finne en løsning som garantert gir rett svar. Jeg vil foreslå en endring av tabellstrukturen til også å inneholde en kolonne som inneholder dato/tid, og så bruke en spørring á la denne: select avg(måling) from tabell where time >= CURRENT_TIME - 100/(24*60) Lenke til kommentar
ofredstie Skrevet 24. april 2006 Del Skrevet 24. april 2006 Nei nei, da får du gjennomsnittet av de 100 høyeste verdiene. Dette er en seriøs designfeil, for i en database kan du ikke garantere at dataene kommer ut i samme rekkefølge som de blir satt inn, så her er det umulig å finne en løsning som garantert gir rett svar. Jeg vil foreslå en endring av tabellstrukturen til også å inneholde en kolonne som inneholder dato/tid, og så bruke en spørring á la denne: select avg(måling) from tabell where time >= CURRENT_TIME - 100/(24*60) 5977041[/snapback] Ja, saa det naa.. Helt enig med deg, tabellen trenger modifikasjon. Kan ogsaa oppnaas ved aa bruke en id med AUTO_INCREMENT, den hoeyeste verdien vil alltid vaere den siste temperaturen og da burde det vaere enkelt aa faa gjennomsnittet for de siste hundre maalingene. Modifisert tabell: CREATE TABLE wdata ( wdata_id INT(20) NOT NULL AUTO_INCREMENT, tempout FLOAT(4,2) NOT NULL, time_date TIMESTAMP(14) NOT NULL, -- CONSTRAINT WDATA_PK PRIMARY KEY (wdata_id) ); Da burde en spoerring alla dette faa rett resultat: SELECT AVG(tempout) AS avgtemp FROM wdata ORDER BY wdata_id DESC LIMIT 100; Lenke til kommentar
siDDis Skrevet 24. april 2006 Forfatter Del Skrevet 24. april 2006 Mange bra svar her som fekk gira meg opp litt så eg greide det til slutt. Eg har jo alltid ein tabell med ID'er så løsninga mi blei jo sånn SELECT AVG(tempout) AS avgtemp FROM wdata WHERE wdata_id BETWEEN ( SELECT MAX(wdata_id-60) FROM wdata ) AND ( SELECT MAX(wdata_id) FROM wdata ) ; Lenke til kommentar
roac Skrevet 24. april 2006 Del Skrevet 24. april 2006 Mange bra svar her som fekk gira meg opp litt så eg greide det til slutt. Eg har jo alltid ein tabell med ID'er så løsninga mi blei jo sånn SELECT AVG(tempout) AS avgtemp FROM wdata WHERE wdata_id BETWEEN ( SELECT MAX(wdata_id-60) FROM wdata ) AND ( SELECT MAX(wdata_id) FROM wdata ) ; 5977724[/snapback] Ufattelig dårlig gode, denne er MYE bedre: SELECT AVG(tempout) AS avgtemp FROM wdata WHERE wdata_id >= ( SELECT MAX(wdata_id)-60 FROM wdata ); Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå