Avatar billede nih Novice
25. marts 2002 - 08:57 Der er 11 kommentarer og
2 løsninger

SQL first - last

Jeg har en tabel over tankpejlinger:
tabel1: (dato, pejling)

Jeg ønsker en SQL der giver mig første og sidste pejling inden for en given tidsperiode:

SELECT First(pejling) AS Første, Last(pejling) AS Ofpejling
FROM Tabel1
WHERE dato Between #2002/01/01# And #2002/02/01#;

Hvordan sikre jeg mig at det er den første pejling, hvis posterne er indtastet i 'forkert' rækkefølge.

Niels
25. marts 2002 - 09:00 #1
Skriv "Order By" i slutningen af sætningen :o)
Avatar billede nih Novice
25. marts 2002 - 09:11 #2
Du har forsøgt at køre en foresp, der ikke medtager det angivne udtryk 'tabel1.dato" som en del af agregatfunktionen.

Den giver følgende fejlmelding.

Niels
25. marts 2002 - 09:19 #3
Nå ja, du er også nød til at group by på pejling:

SELECT First(pejling) AS Første, Last(pejling) AS Ofpejling
FROM Tabel1
GROUP BY Pejling
WHERE dato Between #2002/01/01# And #2002/02/01#
Order By Dato;
Avatar billede nih Novice
25. marts 2002 - 09:27 #4
Hvis jeg group by pejling får jeg jo alle pejlinger med :(

Niels
Avatar billede nih Novice
25. marts 2002 - 09:29 #5
Order by dato giver stadig fejl.

Niels
25. marts 2002 - 09:33 #6
hmm, endnu en forglemmelse! Prøv:

SELECT First(pejling) AS Første, Last(pejling) AS Ofpejling
FROM Tabel1
GROUP BY Pejling
HAVING dato Between #2002/01/01# And #2002/02/01#
Order By Dato;

(hvorfor bruger du ikke forespørgselsgeneratoren? Så får du jo det hel forærende? Jeg er sgu selv blevet lidt rusten til det her - det andet er jo så nemt)
Avatar billede nih Novice
25. marts 2002 - 09:43 #7
Det gør jeg også - Men den er lidt svær at vise herinde ;)

Når jeg trækker 'dato' for at sortere stigende får jeg enten alle poster - eller fejlmelding.

problemmet er at jeg ikke vil gruppere på noget felt - og det hjælper ikke at lave en Q_Sort:
SELECT Tabel1.* FROM Tabel1 ORDER BY Tabel1.dato;
og bruge den som input tabel.

HokusPokus med TOP 1 - driller idet der er flere tanke.

Niels
25. marts 2002 - 10:06 #8
Så snart du har en aggregatfunktion i forespørgslen (Last, Sum, Count, Max eller lign.) så er du nødt til at gruppere, hvis du vil have kriterier og sortering med. Men hvis du bare Group'er på alle felter, så sker der jo ikke noget ved det.

Problemet ved din forespørgsel er, at hvis du vælger at vise totaler, så skriver den også "group By" under Last(Pejling) og First(Pejling). Her skal slet ikke stå noget.
Hvis du starter fra scratch og vælger at det skal være en grupperingsforespørgsel og derefter vælger First og Last i rækken Total og derefter vælger sortering og kriterier, så får du noget der minder om det, jeg skrev 09:33:50.
Den skulle da meget nødig vise alle poster!?
Avatar billede jkrons Professor
25. marts 2002 - 10:16 #9
thomas> Problemet er, at din forespørgsel viser den første og sidste pejlinghver dag inden for perioden, mens nih kun vil se den første og sidste pejling i perioden. Det betyder at han så viddt jeg ved, ikke kan bruge HAVING, men skal have en WHERE. Har han det kan han ikke GROUP BY eller SORT BY på det samme felt.Jeg tor simpelthen ikke man kan lave en forespørgsel på de givne data, der sikrer art der altid findes de rigtige, også hvis de er indtastet forkert.
Avatar billede nih Novice
25. marts 2002 - 10:24 #10
Til andre målinger anvender jeg MIN og MAX, men en olietank fyldes jo op en gang imellem - derfor det lidt irriterende problem at jeg SKAL finde den første og sidste pejling.

Niels
Avatar billede jkrons Professor
25. marts 2002 - 10:34 #11
Jeg forstår problemet, men kan ikke lige komme op med en løsning.
Hvis du indtatster den sidste pejling før den første, vil Access jo ikke på nogen måde kunne se forskel. Første og Sidste finder jo de første og sidste i tabellen, og hvis det der skull være sidste står før det, der skulle være første..... eller hvis du har nogen, som hverken er første eller sidste, men som står på en af de pladser.

Tastefejl er det svært at gardere sig imod.
Avatar billede nih Novice
25. marts 2002 - 11:17 #12
SELECT Min(Tabel1.dato) AS d1, Max(Tabel1.dato) AS d2, DLookUp("[pejling]","tabel1","[dato] =#" & [d1] & "#") AS p1, DLookUp("[pejling]","tabel1","[dato] =#" & [d2] & "#") AS p2
FROM Tabel1
WHERE (((Tabel1.dato) Between #1/1/2002# And #2/1/2002#));

Den her giver det ønskede resultat - Men hvis et klogt hoved kan lave en 'ren' SQL, er der point.

Niels
Avatar billede nih Novice
24. juli 2002 - 16:43 #13
Lukker
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