Avatar billede hugopedersen Nybegynder
30. september 2008 - 07:16 Der er 15 kommentarer og
1 løsning

Tricky query

Jeg har en tabel
CenterID, TimeStamp, KabineNo, Dato, Tid
Her vil jeg gerne kunne vælge de records for hvert center der er nyest (med det 'højeste' timestamp) Men da der kan være forskelligt antal records for hvert CenterID, kan jeg ikke lige gennemskue hvordan den kringles.
Avatar billede mugs Novice
30. september 2008 - 07:26 #1
SELECT DISTINCT Tabel1.centerID, Max(Tabel1.felt1) AS MaksOffelt1
FROM Tabel1
GROUP BY Tabel1.centerID;
Avatar billede hugopedersen Nybegynder
30. september 2008 - 15:18 #2
Den returnerer kun 1 record for hvert CenterID, men jeg kan have op til 20 jeg skal bruge.
Det er nogle tællere (kroner) for hver kabine der skal bruges til at finde indtjening, men i nogle centre kan disse tællere blive resat op til flere gange om dagen og så har jeg balladen.
Avatar billede mugs Novice
30. september 2008 - 15:28 #3
"de records for hvert center der er nyest "

Det sprugte du om, og jeg svarede på det. Kan du give yderligere informationer.
Avatar billede hugopedersen Nybegynder
30. september 2008 - 19:58 #4
For hvert CenterID er der x antal records for kabiner - disse er timestampet med samme dato/tid
Det jeg skal bruge er den samling data for hvert center med nyeste/samme timestamp

Måske skal jeg lige lave et udtræk for et par centre til en xls fil som jeg kan sende til dig i morgen så du kan se data - det kan nogen gange hjælpe.
Avatar billede hugopedersen Nybegynder
01. oktober 2008 - 08:12 #5
mugs> Jeg har sendt dig et Excel sheet med et lille udsnit af data så du kan se hvad de er jeg jagter.
Avatar billede kjulius Novice
01. oktober 2008 - 20:54 #6
Prøv med (ikke testet):

SELECT *
FROM dinTabel t
WHERE TimeStamp = (SELECT MAX(TimeStamp) FROM dinTabel WHERE CenterID=t.CenterID)

eller alternativt (heller ikke testet):

SELECT t1.*
FROM dinTabel t1
INNER JOIN (
  SELECT CenterID, MAX(TimeStamp) AS MaxTimeStamp
  FROM dinTabel
  GROUP BY CenterID
) t2 ON t1.CenterID=t2.CenterID AND t1.TimeStamp=t2.MaxTimeStamp

En af disse løsninger burde virke, men som sagt er ingen af dem testede (det må blive din opgave). :-)
Avatar billede hugopedersen Nybegynder
02. oktober 2008 - 11:25 #7
Det sidste forslag er det nærmeste jeg er kommet, men ikke helt godt nok.
Den returnerer kun 1 dato pr. centerID og jeg har brug for alle datoer pr centerID men kun den nyeste.
Måske bliver løsningen på problemet at jeg må klare det i importfunktionen
Avatar billede mugs Novice
02. oktober 2008 - 12:26 #8
"brug for alle datoer pr centerID men kun den nyeste"

Forstår jeg ikke.
Avatar billede hugopedersen Nybegynder
02. oktober 2008 - 12:31 #9
Det forstår jeg da godt - det er noget vås jeg har skrevet :-)

Det skal forståes sådan at jeg skal bruge alle datoer for hvert CenterID, men kun de nyeste records for hver dato = records med 'højeste' timestamp
Avatar billede mugs Novice
02. oktober 2008 - 14:08 #10
Det kan godt være, at jeg er tungnem, men forvirringen breder sig på et højere plan. Iøvrigt kan jeg ikke åbne din fil.
Avatar billede hugopedersen Nybegynder
02. oktober 2008 - 14:11 #11
Det lyder underligt - renamer du først .txt filen til .zip?
Avatar billede kjulius Novice
02. oktober 2008 - 18:28 #12
Jeg synes heller ikke, at din forklaring i 12:31:21 er meget klarere!

Det må blive et skud i tågen, men jeg lægger mærke til, at du nu omtaler dato som et kriterie, så jeg prøver lige at tage det felt med:

SELECT t1.*
FROM dinTabel t1
INNER JOIN (
  SELECT CenterID, Dato, MAX(TimeStamp) AS MaxTimeStamp
  FROM dinTabel
  GROUP BY CenterID, Dato
) t2 ON t1.CenterID=t2.CenterID AND t1.Dato=t2.Dato t1.TimeStamp=t2.MaxTimeStamp

Hvis det ikke er svaret heller, kunne du måske offentliggøre et udsnit af data fra din tabell, og de rækker fra dette dataudsnit du ønsker returneret.
Avatar billede hugopedersen Nybegynder
03. oktober 2008 - 07:01 #13
Jeg ved godt at forklaringen måske ikke er 100% gennemskuelig, så jeg skal gerne gøre et forsøg mere.
Hvert center består af x antal kabiner og for hver af disse kabiner er der 1 record med aflæsninger. Disse records opstår ved at en centerpasser trykker på en knap når han/hun tager penge ud af boksen. I nogle centre sker det så at der tages penge ud flere gange om dagen og derfor er der flere sæt records for den dag.
Det jeg skal ende op med at have er et udvalg af data for hvert center der repræsenterer den sidste aflæsning hver dag.
Jeg ved ikke på forhånd hvor mange records der er pr. center eller hvor mange aflæsninger der har været på en dag.

Jeg har en fil med nogle data i et Excel ark hvor de uønskede data er markeret med rødt. Dem kan jeg sende i en mail hvis du har interesse i det.
Avatar billede hugopedersen Nybegynder
03. oktober 2008 - 07:35 #14
Men jeg vil påstå at dit sidste forslag nok er det nærmeste jeg har været de data jeg ønsker at se :-)
Jeg checker lige lidt videre for at se
Avatar billede hugopedersen Nybegynder
03. oktober 2008 - 10:28 #15
De sidste problemer der er med data er ikke noget denne query kan gøre noget ved (der er nogle records hvor timestamp burde være det samme, men der er 1 sek. forskel)

Så kjulius giver lige et svar for løsningen.
Avatar billede kjulius Novice
03. oktober 2008 - 13:14 #16
Kommer her... :-)
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