Toon posts:

[SQL] Hoe selecteer ik de een na laatste datum ?

Pagina: 1
Acties:
  • 1.404 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ben bezig met het bouwen van een rapport voor een applicatie die ik maak, ik moet hiervoor bekijken welke producten een bepaalde status verandering hebben ondergaan. Hiervoor moet ik bekijken welke producten een bepaalde laatste status hebben en de vorige status. De laatste status haal ik alsvolgt uit de database:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT     *
FROM         Klantbezoek
WHERE     ((ResultaatID = 1 OR
                      ResultaatID = 4 OR
                      ResultaatID = 7 OR
                      ResultaatID = 8)) AND (Datum =
                          (SELECT     MAX(datum)
                            FROM          klantbezoek kb1
                            WHERE      kb1.productid = klantbezoek.productid AND kb1.klantid = klantbezoek.klantid))
ORDER BY KlantID


code:
1
2
3
4
5
6
7
8
id  prod.id klant.id    datum       resultid
15  11  12      14-6-2002   1   
14  10  12      13-6-2002   1   
11  6   12      14-6-2002   8   
17  9   13      21-6-2002   8   
694 31  14      12-6-2002   1   
686 15  14      12-6-2002   1   
692 67  14      12-6-2002   1



in deze query wil nog graag een selectie toevoegen waarbij ik de voorlaatste datum van een productid + klantid het resultaatid wil op halen, waarbij het resultaat id = 1 moet zijn.

ter illustratie:
code:
1
2
3
               datum 1             datum 2
resultid        1                      4                <- deze moet geselecteerd worden
resultid        3                      4                <- deze niet

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je kunt de tabel met zichzelf joinen om er een rij bij te krijgen waarvoor andere condities gelden.

De een-na laatste status kun je iig. ophalen middels een constructie als: where datum = (select max(datum) ... where datum < (select max(datum) ... ))
Een subselect in een subselect dus.

Welke database gebruik je trouwens?
In Oracle zijn hier namelijk speciale functies voor die dit een stuk eenvoudiger maken.

Who is John Galt?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Welke database gebruik je trouwens?
In Oracle zijn hier namelijk speciale functies voor die dit een stuk eenvoudiger maken.
MS SQL server

[ Voor 3% gewijzigd door Verwijderd op 26-04-2003 17:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het een beetje aangepast, maar nu moet ik nog de resultaten die de onderstaande query leverd filteren uit de query daaronder..


(levert alle resultaten die fout zijn (productid, klantid)
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT     ProductID, KlantID
FROM         Klantbezoek kb
WHERE     (Datum >=
                          (SELECT     MAX(Datum)
                            FROM          Klantbezoek kb1
                            WHERE      (ResultaatID = 1) AND (kb.productid = kb1.ProductID) AND (kb.klantid = kb1.KlantID))) 
                      AND (ResultaatID = 2 OR
                      ResultaatID = 3 OR
                      ResultaatID = 5 OR
                      ResultaatID = 6)
ORDER BY KlantID



(levert alle resultaten, hier moeten de productid, klantid's die fout zijn worden verwijderd.)
SQL:
1
2
3
4
5
6
7
SELECT     *
FROM         Klantbezoek kb
WHERE     (Datum >=
                          (SELECT     MAX(Datum)
                            FROM          Klantbezoek kb1
                            WHERE      (ResultaatID = 1) AND (kb.productid = kb1.ProductID) AND (kb.klantid = kb1.KlantID))) 
ORDER BY KlantID

Acties:
  • 0 Henk 'm!

Verwijderd

Dan moet je je where statement nog even uitbreiden met kb.KlantId= en kb.ProductId=

[ Voor 46% gewijzigd door Verwijderd op 27-04-2003 17:33 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sorry, maar ik begrijpje niet helemaal ?

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 14-10 13:38

dusty

Celebrate Life!

Kwestie van dus 2 queries samenvoegen waardoor je een "where not" constructie krijgt zodat je de tweede query doet en dan als voorwaarde neerzet dat het niet in de eerste query mag voorkomen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, klopt allemaal...Dat werkt wel, maar misschien heb ik het niet helemaal duidelijk verteld. Als een productID en een KlantID voorkomen in de bovenste Query, mag deze combinatie niet meer voor komen in de ander query. Dus fout van mij bij de uitleg..
Pagina: 1