Avatar billede sjoran Nybegynder
27. oktober 2006 - 09:03 Der er 7 kommentarer og
1 løsning

Få den første observation fra hver gruppe i en kolonne for sig

Jeg har brug for hjælp til en sql forespørgsel. SQL'en skal tage den første forekomst af en gruppe og så lave en kolonne hvor den første forekomst i gruppen går igen for hver gruppe. Lidt kryptisk forklaring men nedenfor har jeg vist hvad det er jeg gerne vil.

Gruppe  model timer opr_timer
a      06-06 100    100
a      06-07  50    100
a      06-08  20    100
a      06-09  5    100
b      06-08  50    50
b      06-09  10    50

Det er altså kolonnen opr_timer jeg gerne vil lave, de 3 andre kolonner er givet.
Avatar billede Slettet bruger
27. oktober 2006 - 09:34 #1
Først så laver du en forespørgsel, som du kalder MaxVaerdi:

SELECT TabelNavn.Gruppe, Max(TabelNavn.Timer) AS MaxOfTimer
FROM TabelNavn
GROUP BY TabelNavn.Gruppe
ORDER BY TabelNavn.Gruppe;

Så kan du lave den endelige forespørgsel:

SELECT TabelNavn.Gruppe, TabelNavn.Model, TabelNavn.Timer, MaxVaerdi.MaxOfTimer AS opr_timer
FROM TabelNavn INNER JOIN MaxVaerdi ON TabelNavn.Gruppe = MaxVaerdi.Gruppe;

TabelNavn er selvfølgelig den tabel, med kolonnerne gruppe, model og timer!~)
Avatar billede sjoran Nybegynder
27. oktober 2006 - 09:56 #2
Tak for det, men det virker ikke på alle forekomster, da mit eksempel data var mangelfuldt. Jeg har nemlig nogle hvor timerne ikke er maxvaerdi, altså for eksempel hvor den første forekomst er 50 timer og den næste er 60. Det er model kolonnen der angiver om det er den første forekomst. Model kolonnen angiver en periode, først året og dernæst måneden. Denne kolonne er tekst, men det er muligt at sortere på den med "order by model asc", så den første forekomst kommer først. Jeg kan selvfølgelig lave model kolonnen om til tal og så bruge den fremgangsmåde du har beskrevet blot med minvaerdi på model istedet for maxvaerdi.
Avatar billede kabbak Professor
27. oktober 2006 - 09:56 #3
SELECT TabelNavn.Gruppe, TabelNavn.model, TabelNavn.timer, Max(TabelNavn_1.timer) AS opr_timer
FROM TabelNavn INNER JOIN TabelNavn AS TabelNavn_1 ON TabelNavn.Gruppe = TabelNavn_1.Gruppe
GROUP BY TabelNavn.Gruppe, TabelNavn.model, TabelNavn.timer;
Avatar billede sjoran Nybegynder
27. oktober 2006 - 10:14 #4
Supersmart med join til sig selv, så det hele ligger i en forespørgsel. Men samme problematik på MAX(timer) som spg's svar, da det ikke er denne kolonne der afgør om det er første forekomst men derimod kolonnen model.
Avatar billede Slettet bruger
27. oktober 2006 - 11:11 #5
Du skal jo så have flettet First(Tabelnavn.Model) ind...
Avatar billede Slettet bruger
27. oktober 2006 - 11:18 #6
Hvis vi nu gør, som før, så forespørgsel 1, kaldet FirstVaerdi:

SELECT TabelNavn.Gruppe, First(TabelNavn.Model) AS FirstOfModel
FROM TabelNavn
GROUP BY TabelNavn.Gruppe;

Næste kaldet GrpTimer:

SELECT TabelNavn.Gruppe, TabelNavn.Timer
FROM TabelNavn INNER JOIN FirstVaerdi ON (TabelNavn.Gruppe = FirstVaerdi.Gruppe) AND (TabelNavn.Model = FirstVaerdi.FirstOfModel);

Og endeligt:

SELECT TabelNavn.Gruppe, TabelNavn.Model, TabelNavn.Timer, GrpTimer.Timer AS opr_timer
FROM GrpTimer INNER JOIN TabelNavn ON GrpTimer.Gruppe = TabelNavn.Gruppe
ORDER BY TabelNavn.Gruppe, TabelNavn.Model;

Hvis vi så bare lige kan få Kabbak til at samle det i en forespørgsel, så ville det være helt perfekt!~)
Avatar billede Slettet bruger
27. oktober 2006 - 11:20 #7
Lidt afhængigt af din tabel, så er du måske nød til at "order by" gruppe og model i den første forespørgsel..
Avatar billede sjoran Nybegynder
27. oktober 2006 - 12:40 #8
Tak for hjælpen.
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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