Toon posts:

[sql] Nieuwste record vinden

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende datamodel:
code:
1
2
3
4
5
SESSION------<-LOGENTRY
idSession   idLogEntry
...     idSession
           dtmFunctionStart
           idFunctionName

Elke sessie heeft dus een aantal logentries. Ik wil per sessie de nieuwste logEntry hebben. Wel dat is niet zo'n probleem (ik weet niet of de SQL syntax helemaal correct is, ik heb thuis geen SQL Server):
code:
1
2
3
4
SELECT idSession, Max(dtmFunctionStart)
FROM SESSION
INNER JOIN LOGENTRY ON SESSION.idSession = LOGENTRY.idSession
GROUP BY idSession

Het probleem is, ik wil niet per sessie de nieuwste datum hebben, maar het veld idFunctionName.

Het probleem an sich is al opgelost: ik gebruik bovenstaande query als sub-query en dan join ik op het datum-veld (de resolutie van datetime is in SQL volgens mij 1ms, en zo snel log ik niet).
En anders kan je het natuurlijk ook oplossen met een sql-cursor of met ADO.

Ik vind het alleen raar dat je met aggregate functions alleen naar een waarde kan zoeken (met SUM en AVG is dat natuurlijk niet zo gek, maar met MIN en MAX heb je volgens mij wel vaker dat je een ander attribuut van een record wilt hebben).

Of is een andere manier om het nieuwste record te vinden :?

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Ik vind het alleen raar dat je met aggregate functions alleen naar een waarde kan zoeken (met SUM en AVG is dat natuurlijk niet zo gek, maar met MIN en MAX heb je volgens mij wel vaker dat je een ander attribuut van een record wilt hebben).
Vreemd, volgens mij kon ik het wel gewoon meer informatie uit een database halen ook al gebruik ik er een MAX() waarde bij.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:22
Op maandag 08 juli 2002 21:54 schreef dusty het volgende:

[..]

Vreemd, volgens mij kon ik het wel gewoon meer informatie uit een database halen ook al gebruik ik er een MAX() waarde bij.
Dat dacht ik ook. :)

Trouwens, een select max doen om het id van het laatste record op te halen vind ik geen goede oplossing. (Niet echt defensief programmeren om maar eens een term te gebruiken).
Als je SQL Server gebruikt of Access 2000 kan je @@identity gebruiken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op maandag 08 juli 2002 22:09 schreef whoami het volgende:

[..]

Dat dacht ik ook. :)

Trouwens, een select max doen om het id van het laatste record op te halen vind ik geen goede oplossing. (Niet echt defensief programmeren om maar eens een term te gebruiken).
Als je SQL Server gebruikt of Access 2000 kan je @@identity gebruiken.
Bovenstaand voorbeeld is natuurlijk sterk vereenvoudigd. Voor de discussie: verander idFunctionName in strFunctionName (het staat natuurlijk in een andere tabel, maar ik wilde bijzaken even weglaten :) )

Voor elke ingelogde gebruiker wordt een sessie bijgehouden. Elke keer als de gebruiker een functie start, wordt dit gelogd. Op een bepaald scherm voor een beheerder moet een lijst van sessies komen, met daarin de datum/tijd en naam van de laatst door de gebruiker gestartte functie.

En als je met MAX meer info uit de db kunt halen? HOE MOET DAT DAN? Ik kon in SQL Books Online niets vinden :(

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:22
Op maandag 08 juli 2002 22:24 schreef Doekman het volgende:


En als je met MAX meer info uit de db kunt halen? HOE MOET DAT DAN? Ik kon in SQL Books Online niets vinden :(
Welke foutmelding krijg je als je extra gegevens uit de DB haalt met aggregate functies zoals MAX?
maw,
welke fout krijg je als je bv doet:
code:
1
SELECT MAX(id), naam FROM tabel

hint: group by

https://fgheysels.github.io/


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Een group by zal hier m.i. niet veel uitmaken en volgens mij ben je dan ook op het verkeerde pad.

Onderstaande zal meer in de richting komen bij wat je wil (weet niet of het helemaal correct is, maar het gaat om het principe van de correlated query):
code:
1
2
3
4
5
6
7
8
9
10
11
select  a.idSession,
      a.idFunctionName
from    LOGENTRY a
where   a.idLogEntry =
      (
        select top 1 b.idLogEntry
        from       LOGENTRY b
        where     a.idSession = b.idSession
        order by     b.dtmFunctionStart desc
        )
order by idSession asc

Today's subliminal thought is:


Verwijderd

Topicstarter
Op maandag 08 juli 2002 22:29 schreef whoami het volgende:
[..]

Welke foutmelding krijg je als je extra gegevens uit de DB haalt met aggregate functies zoals MAX?
Jij zult het volgende wel bedoelen:
code:
1
SELECT MAX(id), naam FROM tabel GROUP BY naam

groepeert bij naam. En dat wil ik dus niet. Voorbeelddata (zie bovenstaand datamodel, maar idFunctionName is strFunctionName):
code:
1
2
3
4
5
6
7
Session(1)
Logentry(1,1,'8-7-2002 12:00','Inloggen')
Logentry(2,1,'8-7-2002 12:01','Klant opvragen')
Logentry(3,1,'8-7-2002 12:02','Klant wijzigen')
Session(2)
Logentry(4,2,'8-7-2002 12:00','Inloggen')
Logentry(5,2,'8-7-2002 12:03','Product opvragen')

De resultquery moet teruggeven (idSession,strFunctionname)
code:
1
2
Result(1,'Klant wijzigen')
Result(2,'Product opvragen')

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:22
Sorry. Niet volledig gelezen

https://fgheysels.github.io/


Verwijderd

Topicstarter
Geen SQL goeroes in de zaal :?

  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 22:55
hm, eitje..
code:
1
2
3
4
5
6
7
select s.idSession, 
     l.idFunctionName
from   logentry l inner join session s
     on (l.idSession  = s.idSession)
where  l.dtmFunctionStart =  (select max(dtmFunctionStart)
                    from   logentry
                     where  idSession = l.idSession)

(uiteraard heb je in jouw geval niet eens een join met de session table nodig, maar ik ga er vanuit dat je evt. nog wat meer informatie uit je session table mee wilt nemen)

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Op dinsdag 09 juli 2002 17:23 schreef Doekman het volgende:
Geen SQL goeroes in de zaal :?
nou ja zeg :? ik zal nog 's de moeite nemen om een antwoord te plaatsen :(

Today's subliminal thought is:


Verwijderd

Topicstarter
Op dinsdag 09 juli 2002 18:36 schreef Annie het volgende:

nou ja zeg :? ik zal nog 's de moeite nemen om een antwoord te plaatsen :(
Sorry, heb ik jou antwoord gewoon helemaal niet gezien! BEDANKT!
Pagina: 1