Avatar billede webcreator Nybegynder
25. maj 2005 - 18:51 Der er 30 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, 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 = 26
GROUP BY DATE_FORMAT(timestamp, '%Y-%m-%d %H:%i') ORDER BY timestamp
Avatar billede barklund Nybegynder
25. maj 2005 - 18:59 #1
Hvorfor grupperer du uden at bruge nogle grupperingsfunktioner noget sted? Hvad gør grupperingen?
Avatar billede bojo Nybegynder
25. maj 2005 - 19:05 #2
Måske dette vil virke:

where TESTresults.loebetid < (MAX(TESTresults.loebetid) * 0.95) AND TESTresults.loebetid > ( (MAX(TESTresults.loebetid) - MIN(TESTresults.loebetid)) * 0.05)
Avatar billede webcreator Nybegynder
25. maj 2005 - 19:12 #3
Hej Bojo.
Mange tak - ser jo smart ud. Men jeg får fejlen :
Invalid use of group function
Avatar billede webcreator Nybegynder
25. maj 2005 - 19:14 #4
Hvis jeg fjerner min egen GROUP BY og ORDER BY, så får jeg for øvrigt stadig fejlen
Avatar billede webcreator Nybegynder
25. maj 2005 - 19:26 #5
Andre gode bud ? :)
Avatar billede barklund Nybegynder
25. maj 2005 - 19:42 #6
Hvad bruger du din grouping funktion til? Jeg forstår det ikke helt... Men ja, det vil kunne lade sig gøre ved at først at tælle, hvor mange der er i alt og så kun udvælge dem i midten via limit og offset - men jeg kan ikke lige nemt se, hvordan man kan tælle resultater uden at bruge en subquery, når nu du allerede har en grouping på (som du iøvrigt ikke rigtig bruger til andet end at minimere resultatsættet på mærkelig vis)
Avatar billede webcreator Nybegynder
25. maj 2005 - 20:13 #7
GROUP samler alle resultaterne med samme sekund-tid.
18:32:16 - 100 kr.
18:32:16 - 200 kr.
18:32:16 - 300 kr.

Ovenstående giver GROUP'ed 200 kroner.
Avatar billede webcreator Nybegynder
25. maj 2005 - 20:13 #8
Jeg havde faktisk også overvejet en subQuery, men vil helst lave det i én.
Avatar billede barklund Nybegynder
25. maj 2005 - 21:44 #9
Hvor kommer kronerne fra? Og det giver da kun 200, hvis du kører en AVG() på det - men du tager bare den første af de grupperede? Du bruger jo ingen grupperingsfunktioner såsom AVG(), COUNT() og tilsvarende.
Avatar billede webcreator Nybegynder
26. maj 2005 - 12:02 #10
Hovsa. Ja, hvor søren er min AVG blevet af? Det havde jeg da med i min første version. Hmm..
Avatar billede webcreator Nybegynder
26. maj 2005 - 12:03 #11
Ovenstående var bare et eksempel med penge. Ikke noget der har med mit nuværende projekt at gøre :)

Burde min første linie i SQL query'en ikke være :
SELECT TESTresults.timestamp, TESTresults.loebeNummer, AVG(TESTresults.loebetid)  ?
Avatar billede webcreator Nybegynder
26. maj 2005 - 12:10 #12
Har lige testet - fungerer. Men man bør måske tilføje ;
SELECT TESTresults.timestamp, TESTresults.loebeNummer, AVG(TESTresults.loebetid) AS loebetid

Nu forstår jeg bedre, hvorfor du var forvirret :)
Avatar billede barklund Nybegynder
26. maj 2005 - 12:12 #13
Jeg forstår simpelthen ikke din query - ejere er vel personer? Kan en person have flere tider det samme minut? Og når du grupperer på timestampet, hvorfor udvælger du så løbenummer - altså bare et af løbenumrene? Du får dermed ikke alle de løbenumre, som han kan have det samme minut?

Kan du ikke skitsere din ønskede løsning i lidt større perspektiv og forklare din tabel-struktur?
Avatar billede webcreator Nybegynder
26. maj 2005 - 12:18 #14
Det er til en væddeløbsbane :)
Jeg ved ikke, om det er nødvendigt at forstå strukturen..?

Jeg ønsker bare at udelukke 5% af posterne med den bedste løbetid (det felt som hedder loebetid) og 5% af posterne med den dårligste løbetid (igen loebetid).
Avatar billede barklund Nybegynder
26. maj 2005 - 12:28 #15
Jeg kan ikke hjælpe dig uden at forstå din query - og jeg kan ikke forstå din query og dens intention udfra ovenstående :)
Avatar billede barklund Nybegynder
26. maj 2005 - 12:28 #16
Du er velkommen til at få hjælp fra nogle andre, der kan forstå den udfra det givne, men det kan jeg ikke :)
Avatar billede webcreator Nybegynder
26. maj 2005 - 12:39 #17
Hulk :)
Jeg ved sørme ikke hvad jeg skal forklare dig.

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å sekund/minut-tiden) for at få et gennemsnit på, hvor hurtigt alle hundene til en given ejer løb. En sådan ejer kan jo have både 2, 5 og 10 hunde med i løbet (ja ja - overdrivelse fremmer forståelsen ;).

For at få et bedre gennemsnit, 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 :)

Håber det hjalp en smule :)
Avatar billede webcreator Nybegynder
26. maj 2005 - 12:40 #18
Ja, det er lidt sort, men det forventes at hundene kommer ind på samme minut-tid. Det er faktisk time-tiden der skal grupperes på. Detalje. Igen et mærkeligt krav.
Avatar billede webcreator Nybegynder
26. maj 2005 - 12:41 #19
Men lad os blot smide gruppering væk i første omgang så vi har flg. :

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 = 26 ORDER BY timestamp
Avatar billede barklund Nybegynder
26. maj 2005 - 13:47 #20
Så timestampet dækker over det løb, der har været med i? Er det så ikke smartere at have et løbs-id, som du kan gruppere på? For at gruppere på det tidspunkt, hvor løbet starter - det er lidt noget mærkeligt noget :)

Og det er så når man har en liste af hvordan ens hunde i gennemsnit har klaret sig i X løb, vil du så have de løb, hvor hundene har klaret sig dårligst hhv. bedst ud af listen, eller vil du for hvert løb have de x dårligste/bedste hunde ud af gennemsnittet?
Avatar billede webcreator Nybegynder
26. maj 2005 - 14:34 #21
Korrekt, timestampet dækker over løbet. Og det er ikke noget der kan laves om. Det er krav til løsningen. Så det må vi bare affinde os med :)

Mht. resultatlisten genereret af SQL query'en, så ønsker jeg at fx 3% af en ejers hunde sorteres fra i "begge ender". Dvs. har en ejer 9 hunde med, frasorteres de 3 hunde med den bedste tid, og de 3 hunde med den dårligste tid. Igen sort - men sådan er det nu engang. Det er en eksisterende løsning jeg bygger videre på, hvorfor strukturen ikke står til diskussion :)
Avatar billede barklund Nybegynder
26. maj 2005 - 14:59 #22
Altså per løb - så gennemsnitstiden for en ejers hund i løb x skal kunne være en sum af de midterst placerede hund - ikke de x% bedste/dårligste?

Og 3% af 9 er ikke 3 - det er 0!
Avatar billede webcreator Nybegynder
26. maj 2005 - 16:42 #23
Sorry, jeg vrøvlede også. Mente 33 % :)
Avatar billede webcreator Nybegynder
26. maj 2005 - 16:44 #24
"så gennemsnitstiden for en ejers hund[e] i løb x skal kunne være en sum af de midterst placerede hund - ikke de x% bedste/dårligste?"  <=== Korrekt ! :))
Avatar billede barklund Nybegynder
26. maj 2005 - 16:46 #25
Det kan jeg ikke lige gennemskue, hvordan man kan gøre - du kan jo ikke finde de x midterste uden du først finder alle resultaterne. Jeg tror du er nødt til enten at bruge subqueries(og dermed mysql version 4.1 eller større) eller hive det ud og beregne i PHP.

Men jeg forstår nu, hvad det er du vil :)
Avatar billede webcreator Nybegynder
26. maj 2005 - 17:07 #26
Kanon at du er med på hvad jeg mener :)

Faktisk er vi i den heldige situation, at vi benytter MySQL 4.1. Så det skulle ikke være et problem. Tror du, at du kunne give et eksempel på hvordan det kunne gøres?
Avatar billede barklund Nybegynder
26. maj 2005 - 17:29 #27
Ja, men det er ikke helt enkelt, så det bliver ikke lige nu - jeg kigger måske på det i morgen, men nu skal jeg ud i solen og drikke mig en kold øl :)
Avatar billede webcreator Nybegynder
26. maj 2005 - 17:38 #28
Det lyder fornuftigt :)
Tak indtil nu :)
Avatar billede webcreator Nybegynder
27. maj 2005 - 18:51 #29
Hej igen.
Er du kommet på noget godt ?
Avatar billede webcreator Nybegynder
27. maj 2005 - 18:53 #30
Hov for søren. Jeg ser pludselig, at jeg har oprettet spørgsmålet i PHP kategorien. Det var en fejl. Det er faktisk til et C# program. Jeg tror lige jeg lukker spørgsmålet, og flytter det over til C# i stedet. Det kunne jo være, at der var andre dér, der kendte et fif til lige netop C#.

Men du må stadig gerne komme med dit bud (gerne i det nye spørgsmål). SQL er jo SQL - lige meget hvilket sprog det benyttes i :)
Avatar billede webcreator Nybegynder
27. maj 2005 - 19:01 #31
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester