25. maj 2005 - 18:51Der 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
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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)
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.
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?
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).
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 :)
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.
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
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?
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 :)
"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 ! :))
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.
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?
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 :)
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.