27. maj 2005 - 18:57Der er
41 kommentarer og 1 løsning
Hent poster, grupper på tid, træk 5% dårligste og 5% bedste fra
Hej eksperter.
Jeg ønsker at hente nogle poster ud af min database, som indeholder et timestamp. Pt. gruppere jeg på minut-tiden. Men er det muligt, inden grupperingen, at udelukke 5% af posterne med den bedste løbetid (loebetid) og 5% af posterne med den dårligste løbetid?
Min query indtil nu :
SELECT TESTresults.timestamp, TESTresults.loebeNummer, AVG(TESTresults.loebetid) FROM TESTresults, TESTejere, TESTnumbers WHERE (timestamp BETWEEN '2004-01-01 00:00:00' AND '2006-01-01 00:00:00') AND TESTnumbers.loebeNummer = TESTresults.loebeNummer AND TESTnumbers.ejerId = TESTejere.ejerid AND TESTnumbers.ejerid = 24 GROUP BY DATE_FORMAT(timestamp, '%Y-%m-%d %H:%i') ORDER BY timestamp
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
Jeg har en række ejere af fx hunde. Disse ligger i TESTejere. Til hver ejer er tilknyttet X antal numre (løbenumre - fx 2 hunde der kan løbe om kap). Ligeledes er der til ejeren tilknyttet X løbe-resultater (i tabellen TESTresults).
Jeg har grupperet på loebetid (på time-tid - ikke på minut-tiden som jeg fejlagtigt skrev før) for at få et gennemsnit af, hvor hurtigt alle hundene til en given ejer løb. Tiden som der grupperes på, udgør faktisk et løb. Et løbenummer havde været smartere, men sådan er den nuværende løsning ikke lavet, og jeg kan ikke få lov at lave det om. En ejer kan have både 2, 5 og 10 hunde med i løbet (ja ja - overdrivelse fremmer forståelsen ;).
For at få et bedre gennemsnit på en ejers hunde/heste (han/hun har måske haft 10 med i kapløbet), er jeg dog blevet bedt om, at fratrække X % af de bedste tider og X % af de dårligste tider. Det skal i hvertfald være en option de kan vælge. Så jeg mangler bare SQL'en til denne operation :)
Det lyder super godt, at det sandsynligvis kan lade sig gøre. Jeg kan dog ikke, ud fra dit eksempel, se hvordan det kan implementeres i min løsning. Er der tale om subQueries eller hvordan ? Kunne jeg få dig til at gøre det kedelige arbejde for mig, og skrive det ind i mit eksempel? Ved du om der findes noget dokumentation ang. den metode du bruger, eller er det bare simpel matematik?
SELECT X.timestamp, X.loebeNummer, AVG(X.loebetid) FROM (SELECT TESTresults.timestamp, TESTresults.loebeNummer, TESTresults.loebetid FROM TESTresults, TESTejere, TESTnumbers WHERE (timestamp BETWEEN '2004-01-01 00:00:00' AND '2006-01-01 00:00:00') AND TESTnumbers.loebeNummer = TESTresults.loebeNummer AND TESTnumbers.ejerId = TESTejere.ejerid AND TESTnumbers.ejerid = 24 ORDER BY loebetid LIMIT A,B) X GROUP BY DATE_FORMAT(timestamp, '%Y-%m-%d %H:%i') ORDER BY timestamp
SELECT COUNT(*) FROM TESTresults WHERE (timestamp BETWEEN '2004-01-01 00:00:00' AND '2006-01-01 00:00:00') AND TESTnumbers.loebeNummer = TESTresults.loebeNummer AND TESTnumbers.ejerId = TESTejere.ejerid AND TESTnumbers.ejerid = 24 GROUP BY DATE_FORMAT(timestamp, '%Y-%m-%d %H:%i')
Ser nedenstående forkert ud ? 'n' bliver bare '0'. Men udfører jeg mit SQLStateCount i min database, får jeg et resultat. I øvrigt fejler While-løkken også ved 2. gennemløb. Jeg får fejlen : "Connection must be valid and open".
Det er måske værd at gøre opmærksom på, at jeg bruge min forbindelse længere nede i koden i en anden MySQLCommand instans. Men det skulle vel ikke gøre noget.
MySqlCommand command = new MySqlCommand(SQLStateCount, con);
Jeg tror kun jeg har ét problem tilbage. I mit COUNT statement bliver jeg på en eller anden måde nødt til at lave noget GROUPing. Det resultat jeg får tilbage med alle posterne, er nemlig grupperet. Så pt. får jeg fx 12 poster i Count-statementet, men kun 10 poster i resultat-statementet, da 2 af posterne har sekundtiden 43 og 2 andre har sekundtiden 44. Altså bliver disse 4 poster slået sammen til 2. Og så giver det 10 (10 != 12)
Jeg har prøvet at gruppere, og dette giver mig 10 poster - hveraf værdien i 2 af dem er 2 (da det jo netop er to tider der er slået sammen). Så jeg kunne fuske, og blot i mit program tælle antallet af returnerede rows. Men det må kunne gøres pænere.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.