Avatar billede chsk Nybegynder
19. november 2008 - 23:35 Der er 17 kommentarer og
1 løsning

Højeste værdi repræsenteret i forskellige dage. max()/distinct?

Hejsa alle eksperter.

Jeg har i et tabel følgende poster (eksempel).

ID, Date, value
1,2008-12-01 12:00:00, 6
2,2008-12-01 13:00:00, 3
3,2008-12-02 07:00:00, 8
4,2008-12-02 12:30:00, 5

Altså 4 poster fordelt på 2 dage med forskellige værdier i 'value'.
Nu vil jeg gerne finde den højeste værdi der er repræsenteret i de forskellige dage. Men isoleret, så dagene kun optræder én gang.

så det ser sådan her ud: (eksempel)
ID, Date(ikke tid), Value
1, 2008-12-01, 6
2, 2008-12-02, 8

Jeg har rodet lidt med max() og DISTINCT med uden held.
Håber i kan hjælpe
Mvh
Christian
Avatar billede arne_v Ekspert
19. november 2008 - 23:38 #1
prøv:

SELECT DATE_FORMAT(dato,'%Y-%m-%d'),MAX(val)
FROM tabel
GROUP BY DATE_FORMAT(dato,'%Y-%m-%d')
Avatar billede chsk Nybegynder
19. november 2008 - 23:44 #2
JO, det var jo hurtigt - og det virker. Vil du ha points?
:)
Christian
Avatar billede chsk Nybegynder
19. november 2008 - 23:51 #3
Et enkelt spg mere.

Hvis nu en post optræder med den samme MAX værdi flere gange og jeg så gerne vil ha den der ligger tidligst iforhold til klokkeslettet? 
Eksempel:
1,2008-12-01 12:00:00, 6
2,2008-12-01 13:00:00, 3
3,2008-12-02 07:00:00, 8 *
4,2008-12-02 12:30:00, 5
5,2008-12-02 13:30:00, 8 *

Her er værdien 8 to gange d. 2 december, jeg er interesseret i den første?
Christian
Avatar billede arne_v Ekspert
19. november 2008 - 23:56 #4
gerne
Avatar billede arne_v Ekspert
19. november 2008 - 23:57 #5
d.v.s. at du vil have fat i værdien for feltet id for de rækker du finder ?
Avatar billede chsk Nybegynder
19. november 2008 - 23:58 #6
altså et Id udtræk på den der ligger tidligst..
PS. Hvis du gerne vil har points først er det også fint..
Avatar billede chsk Nybegynder
20. november 2008 - 00:02 #7
Ja, der vil være situationer hvor max værdien optræder flere gange men med samme antal ( i eksempelet værdien 8 på datoen 2008-12-02. Den optræder i eksemplet 2 gange.)
Jeg har brug for Id på den der kommer først iforhold til klokkeslettet.

Mvh
Christian
Avatar billede arne_v Ekspert
20. november 2008 - 00:11 #8
Den er straks mere tricky.

Prøv den her søslange:

SELECT *
FROM tabel a
WHERE NOT EXISTS (SELECT *
    FROM tabel b
    WHERE DATE_FORMAT(b.dato,'%Y-%m-%d') = DATE_FORMAT(a.dato,'%Y-%m-%d')
          AND (b.val > a.val OR (b.val = a.val AND b.id < a.id)))
Avatar billede chsk Nybegynder
20. november 2008 - 00:15 #9
arne? Du har to tabeller i koden. Hvad er no2 tabel?
Christian
Avatar billede arne_v Ekspert
20. november 2008 - 00:32 #10
Nej - jeg har kun en tabel men jeg har to aliaser for den kaldet a og b.
Avatar billede chsk Nybegynder
20. november 2008 - 00:42 #11
Nå,  jeg ved ikke hvordan jeg skal implementere det i mit eksempel.. Jeg har ikke arbejdet med aliaser før. kan du gi et eksempel. evt til posten i denne tråd kl: 32:51.
Christian
Avatar billede chsk Nybegynder
20. november 2008 - 00:42 #12
23:51 typo...
Avatar billede arne_v Ekspert
20. november 2008 - 00:57 #13
Koden skulle matche din data struktur - den bruger tabelnavn tabel og felt navne id,dato,val.
Avatar billede chsk Nybegynder
21. november 2008 - 16:11 #14
Koden virker som den gamle, men jeg skal sorterer på klokkeslettet, finde den højeste værdi for en givende dag samt Id på den først kommende,  højeste værdi.
Som jeg ser tråden: 20/11-2008 00:11:06, Så sorterer du på Id?

tabel.
Id, Date, value
1,2008-12-01 12:00:00, 6
2,2008-12-01 13:00:00, 3
3,2008-12-02 07:00:00, 8 *
4,2008-12-02 12:30:00, 5
5,2008-12-02 13:30:00, 8 *

Her er 8 den højeste værdi d. 2 december. Det vil jeg gerne udtrække samt hvornår 8 (den højeste værdi) først forekommer (tidspunktet) på denne dag. I dette tilfælde kl. 07:00:00. Med din kode skriver den 13:00:00 som er den sidste forkommende.Eller sidst oprettet.

Håber jeg udtrykker mig godt nok..

Mvh Christian
Avatar billede arne_v Ekspert
23. november 2008 - 04:21 #15
SELECT *
FROM data a
WHERE NOT EXISTS (SELECT *
                  FROM data b
                  WHERE DATE_FORMAT(b.dato,'%Y-%m-%d') = DATE_FORMAT(a.dato,'%Y-%m-%d')
                  AND (b.val > a.val OR (b.val = a.val AND b.dato < a.dato)));
Avatar billede chsk Nybegynder
23. november 2008 - 14:58 #16
Hej arne_v. Det virker næsten.
Hvordan laver jeg LIMIT på 1 for hver enkel dag. Hvis der findes flere datoer med samme højeste værdi og starttid -kommer de alle med nu.. Jeg skal bare bruge én - det spiller ingen rolle hvilken bare tidspunktet er det tidligste...

Og tak! (du skal vel snart ha nogen flere point, det har jo udartet sig til 3 nye spgs!)
christian
Christian
Avatar billede arne_v Ekspert
23. november 2008 - 16:15 #17
Prøv:

SELECT *
FROM data a
WHERE NOT EXISTS (SELECT *
                  FROM data b
                  WHERE DATE_FORMAT(b.dato,'%Y-%m-%d') = DATE_FORMAT(a.dato,'%Y-%m-%d')
                  AND (b.val > a.val OR (b.val = a.val AND b.dato < a.dato) OR (b.val = a.val AND b.dato = a.dato AND b.id < a.id));
Avatar billede chsk Nybegynder
23. november 2008 - 16:59 #18
Tak Arne, det virker perfekt!
smider nogle ekstra points til dig i Mysql forumet!

Christian
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
Computerworld tilbyder specialiserede kurser i database-management

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