21. oktober 2010 - 14:29Der er
9 kommentarer og 1 løsning
Udregne gennemsnitshastighed.
Hej.Jeg har nedenstående script, hvor jeg gerne vil regne gennemsnitshastigheden ud. Det passer bare ad pommeren til. Skulle der være en der kan se hvor der skulle mangle et tegn eller noget?
$wins = mysql_query("SELECT ec.id AS id, ec.rytter AS rytter, ec.id AS tid, ec.length AS length, t.id AS rytterid, t.name AS name, t.flags AS flags, t.logo AS logo,
SUM(ec.length) AS ialt, SEC_TO_TIME(SUM(TIME_TO_SEC(ec.tid))) AS sum,
HOUR(ec.tid) AS t, MINUTE(ec.tid) AS m, SECOND(ec.tid) AS s,
Der er såmænd bare tilføjet et "t", men uden virkning.
$wins = mysql_query("SELECT ec.id AS id, ec.rytter AS rytter, ec.tid AS tid, ec.length AS length, t.id AS rytterid, t.name AS name, t.flags AS flags, t.logo AS logo,
SUM(ec.length) AS ialt, SEC_TO_TIME(SUM(TIME_TO_SEC(ec.tid))) AS sum,
HOUR(ec.tid) AS t, MINUTE(ec.tid) AS m, SECOND(ec.tid) AS s,
For at faa gns for en rytter skulle du dividere totalafstanden, med totaltiden. Du beregner totalafstanden og kalder den 'ialt'. Men i stedet for at dividere 'ialt' med totaltiden dividerer du ec.length med totaltiden.
Nu er det noget tid siden jeg selv var i gang med lignende opgaver, saa for at oeve mig lavede jeg et par tabeller seev_etape og seev_turen og fyldte nogle vaerdier i som jeg viser nedenfor og jeg proevede at regne gennemsnitshastigheder ud.
Totalafstanden fandt jeg, som du, ved SUM(ec.length).
Men jeg syntes du gjorde dig unoedvendigt besvaer ud af at finde totaltiden. Jeg gaar ud fra at datatypen i ec.tid er TIME, og saa finder du totaltiden i sekunder som SUM(TIME_TO_SEC(ec.tid)).
Saa fandt jeg ud af at mysql (eller min version) ikke accepterer aliaser defineret i en query til at definere udtryk i samme query. Saa jeg fandt gennemsnitstid ved:
SUM(ec.length)/SUM(TIME_TO_SEC(ec.tid)).
Da jeg i min tabel definerer length i meter faar jeg gennemsnitshastighede i kilometer i timen ved at gange denne stoerrelse med 3.6.
Og saa blander du i en enkelt query vaerdier for enkelt raekker (ec.id, ec.tid, ec.length, o.s.v.) med grupperede vaerdier (..GROUP BY t.id). Det resulterer som regelt i noget sludder idet du blot faar den foerste ec.id, ec.tid, ec.length .. per gruppe.
Saa med nedenstaaende tabeller regner jeg gennemsnitshastighederne per rytter ud saaledes:
SELECT t.name, SUM(ec.length) AS ialt, SUM(TIME_TO_SEC(ec.tid)) AS sum, 3.6*SUM(ec.length)/SUM(TIME_TO_SEC(ec.tid)) AS gns FROM seev_etape ec JOIN seev_turen t ON ec.rytter = t.id GROUP BY t.id;
og jeg faar disse resultater (som er matematiske korrekte skoent rytterne nok ikke hoerer til de hurtigste:)
CREATE TABLE seev_etape(id INT, rytter INT, tid TIME, length INT);
CREATE TABLE seev_turen(id INT, name VARCHAR(10));
INSERT INTO seev_turen VALUES(1, 'rytter1'); INSERT INTO seev_turen VALUES(2, 'rytter2'); INSERT INTO seev_turen VALUES(3, 'rytter3'); INSERT INTO seev_turen VALUES(4, 'rytter4'); INSERT INTO seev_turen VALUES(5, 'rytter5');
INSERT INTO seev_etape VALUES(1, 1, '01:01:05', 10000); INSERT INTO seev_etape VALUES(1, 2, '01:02:05', 10000); INSERT INTO seev_etape VALUES(1, 3, '01:03:05', 10000); INSERT INTO seev_etape VALUES(2, 4, '01:04:05', 12000); INSERT INTO seev_etape VALUES(2, 5, '01:05:05', 12000); INSERT INTO seev_etape VALUES(2, 1, '01:06:05', 12000); INSERT INTO seev_etape VALUES(3, 2, '01:07:05', 14000); INSERT INTO seev_etape VALUES(3, 3, '01:08:05', 14000); INSERT INTO seev_etape VALUES(3, 4, '01:09:05', 14000); INSERT INTO seev_etape VALUES(4, 5, '01:10:05', 16000); INSERT INTO seev_etape VALUES(4, 1, '02:11:05', 16000); INSERT INTO seev_etape VALUES(4, 2, '02:12:05', 16000); INSERT INTO seev_etape VALUES(5, 3, '02:13:05', 18000); INSERT INTO seev_etape VALUES(5, 4, '02:13:05', 18000); INSERT INTO seev_etape VALUES(5, 5, '02:15:05', 18000); INSERT INTO seev_etape VALUES(6, 1, '02:16:05', 20000); INSERT INTO seev_etape VALUES(6, 2, '02:17:05', 20000); INSERT INTO seev_etape VALUES(6, 3, '02:18:05', 20000); INSERT INTO seev_etape VALUES(7, 4, '02:19:05', 22000); INSERT INTO seev_etape VALUES(7, 5, '02:20:05', 22000);
Tak for points. Lad mig nu goere mig endnu mere klog. Jeg gaar ud fra at en etappeclass har en bestemt laengte uanset hvilken rytter der deltager. Hvis felterne i tabellen er id, rytter, tid, length, saa maa man for hver rytter i etapen gentage laengden. Det er ikke alene ekstra arbejde og opslagsplads, men det giver ogsaa muligheden for at komme til at indfoere en forkert laengde, for eksempel 1000m i stedet for 10000 m, og det vil foere til nogle maerkelige gennemsnit. Jeg foreslaar (jeg ved at det var ikke det du spurgte om) at du laver en saerskilt tabel Etape med etapeid, laengde, maaske navnet paa etapen og andre data hvis relevant og karakteristisk for en etape. Saa ser det ud for mig som om tabellen Turen stort set er en tabel om de enkelte ryttere. Jeg foreslaar (hvis du ikke har det allerede) at lave en tabel Rytter med id, navn, logo (hvis det hoerer til en rytter), og naturligvis stamoplysninger som adresse, klub, medlemsnummer, o.s.v. Saa er der en mange-til-mange relation mellem Etape og Rytter: hver etape vil have mange ryttere og hver rytter vil deltage i mange etaper. Standard-loseningen er at lave en Etape_Rytter tabel. Den tabel skal have kolonnerne Etapeid, Rytterid, tid, maaske dato (maaske goer en rytter den samme etape flere gange,) andre oplysninger der karakteriserer den enkelte tur af en rytter i en etape (hvad betyder for eksempel 'flags?)
Et minimalistisk eksempel:
Etape 1 10000 traeningsetape 2 12345 bakkeetape 3 32137 Langeetape
Rytter 1 hansen 2 jensen 3 olsen 4 svendsen
Etape_Rytter 1 1 0:42:10 1 jan 2010 1 2 0:37:14 1 jan 2010 2 3 1:00:00 1 jan 2010 2 3 0:58:12 2 jan 2010
o.s.v.
Hvis du kan bruge det til noget saa held og lytte. Ellers glem det.
Hej igen. Jeg takker mange gange for din interesse for mit problem. Det du foreslår er stort set det jeg kører i forvejen. Måske på en lidt anden måde, men chancen for fejl er stort set elimineret. Jeg ved ikke om du har besøgt linket jeg sendte med: http://www.tourfacts.dk/tid_ialt.php Her vises tydeligt hvad "flags" bruges til. Nok en gang tak for hjælpen.
Synes godt om
Ny brugerNybegynder
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.