[SQL] Automatisch hoogste waarde gebruiken als limit.

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

  • onne
  • Registratie: December 2000
  • Laatst online: 21:17
Hi! Ik ben echt amateur op SQL gebied maar probeer het volgende te bereiken.

Ik heb een tabel met een column "datum" en een aantal andere columns d´r aan vast.
Nu wil ik alleen de rijen d´r uit halen waar de nieuwste datum bij hoort. Ik zou dat handmatig kunnen doen door gewoon te zeggen WHERE datum = "12-10-04" bijvoorbeeld. Maar ik wil dat hij automatisch de nieuwste datum pakt.
Dus zeg maar eerst zoekt naar de hoogste waarde in de column datum. En vervolgens alle rijen pakt waar die nieuwste datum bij hoort.
Is dit uberhaupt wel mogelijk? Voor m´n gevoel wel, maar zou niet weten hoe het moet. Iets met een max en limit denk ik. Kan iemand me hier verder mee helpen? (evt. met een voorbeeldje).
Bij voorbaat dank!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Op welk platform wil je deze SQL gaan toepassen. Er zitten een aantal verschillen tussen bijv. MySQL en MS-SQL :)

Maar met [google=SQL get highest value] levert de eerste hit al precies op wat je wilt ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17:30

TeeDee

CQB 241

Of een subquery. Maar dat is afaik niet bij alle mySQL versies mogelijk, dus zal je daar wat meer over moeten vertellen.

edit:
BtM909 ...

[ Voor 9% gewijzigd door TeeDee op 03-12-2004 10:25 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • MoBi
  • Registratie: Oktober 1999
  • Laatst online: 26-04 13:50
SELECT *
FROM table
ORDER BY datum DESC

Moet het doen.

Volgens mij zit je te lullen, want ik voel nattigheid....


Verwijderd

TeeDee schreef op vrijdag 03 december 2004 @ 10:25:
Of een subquery. Maar dat is afaik niet bij alle mySQL versies mogelijk, dus zal je daar wat meer over moeten vertellen.

edit:
BtM909 ...
Een subselect is inderdaad een goede, wordt ondersteund vanaf MySQL 4.1 (inmiddels stable). SELECT max ofzo gebruiken :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

MoBi schreef op vrijdag 03 december 2004 @ 10:25:
SELECT *
FROM table
ORDER BY datum DESC

Moet het doen.
Zo krijgt ie de hele tabel...

code:
1
2
3
4
SELECT *
FROM tabel
WHERE datum = NOW()
ORDER BY datum DESC

Dat komt al meer in de richting, maar is nog steeds niet goed, tenzij het zeker is dat er elke dag een record wordt toegevoegd.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Zoiets ?

code:
1
2
3
4
5
6
select
  *
from
  tabel
where
  datum = ( select max(datum) from tabel )

  • Freee!!
  • Registratie: December 2002
  • Laatst online: 16:52

Freee!!

Trotse papa van Toon en Len!

Verwijderd schreef op vrijdag 03 december 2004 @ 11:10:
Zoiets ?

code:
1
2
3
4
5
6
select
  *
from
  tabel
where
  datum = ( select max(datum) from tabel )
Perfect onder de voorwaarde dat de SQL-engine het aankan (zou volgens de ISO-normen wel moeten, maar helaas houden ze zich daar niet allemaal aan).

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


Verwijderd

Kon niet meer inloggen met m´n oude account. Dus reageer even via dit nieuwe account.
Voor de duidelijkheid: het gaat om MS-sql niet my-sql. Er wordt niet iedere dag een nieuw datum veld toegevoegd (slechts 1 x / maand).
Bedankt voor de reacties zover.

Deze laatste reactie:

code:
1
2
3
4
5
6
select
  *
from
  tabel
where
  datum = ( select max(datum) from tabel )


Komt denk ik het meest in de richting voor wat ik zoek. Even testen :)

Verwijderd

in MS-SQL zou het moeten werken. En een index op datum toevoegen werkt ook erg bevorderlijk voor de snelheid natuurlijk.

  • Freee!!
  • Registratie: December 2002
  • Laatst online: 16:52

Freee!!

Trotse papa van Toon en Len!

Verwijderd schreef op vrijdag 03 december 2004 @ 11:16:
in MS-SQL zou het moeten werken. En een index op datum toevoegen werkt ook erg bevorderlijk voor de snelheid natuurlijk.
Als het even kan zelfs een descending index.

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


Verwijderd

Verwijderd schreef op vrijdag 03 december 2004 @ 11:16:
in MS-SQL zou het moeten werken. En een index op datum toevoegen werkt ook erg bevorderlijk voor de snelheid natuurlijk.
Ik gebruik DB2 in combinatie met BrioQuery designer. Krijg bij bovenstaande code een foutmelding.. maar ligt misschien aan m´n notatie.. ik probeer nog even verder.

Verwijderd

Verwijderd schreef op vrijdag 03 december 2004 @ 11:21:
[...]


Ik gebruik DB2 in combinatie met BrioQuery designer. Krijg bij bovenstaande code een foutmelding.. maar ligt misschien aan m´n notatie.. ik probeer nog even verder.
eeeh, in een eerdere post zeg je dat je MS-SQL gebruikt.

Verwijderd

Verwijderd schreef op vrijdag 03 december 2004 @ 11:40:
[...]

eeeh, in een eerdere post zeg je dat je MS-SQL gebruikt.
hahaha ja nogmaals weet er weinig vanaf. Weet dat het geen mysql is, dus dacht dan zou het wel ms-sql zijn. Maar je bedoeld dat ik DB2-SQL gebruik? Dat zal het dan inderdaad zijn :)

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Mr. Liu schreef op vrijdag 03 december 2004 @ 11:13:
[...]

Perfect onder de voorwaarde dat de SQL-engine het aankan (zou volgens de ISO-normen wel moeten, maar helaas houden ze zich daar niet allemaal aan).
Zonder sub-query lukt 't ook wel
SQL:
1
2
3
4
SELECT id, datum
FROM table t1, tabel t2
GROUP BY t1.id, t1.datum
HAVING t1.datum=MAX(t2.datum)

| Toen / Nu


  • Freee!!
  • Registratie: December 2002
  • Laatst online: 16:52

Freee!!

Trotse papa van Toon en Len!

SuperRembo schreef op vrijdag 03 december 2004 @ 13:31:
[...]
Zonder sub-query lukt 't ook wel
SQL:
1
2
3
4
SELECT id, datum
FROM table t1, tabel t2
GROUP BY t1.id, t1.datum
HAVING t1.datum=MAX(t2.datum)
Heel netjes _/-\o_ _/-\o_ _/-\o_

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


  • onne
  • Registratie: December 2000
  • Laatst online: 21:17
Zo, beetje late reactie..
Deze code werkt prima:

code:
1
2
3
4
5
6
select
  *
from
  tabel
where
  datum = ( select max(datum) from tabel )


Bedankt hiervoor, (ik wil juist graag een subquery gebruiken)
om het nu nog iets moeilijker te maken (weet niet of het uberhaupt mogelijk is op deze manier) stel dat ik nou de Max datum wil pakken, en de "Max datum -1" en de "Max datum -2".

Kan dat ook d.m.v bovenstaande code? Dat je als het ware dit doet:

code:
1
2
3
4
5
6
select
  *
from
  tabel
where
  datum = ( select ((max(datum) OR (max(datum)-1) OR (max(datum)-1)) from tabel )


Los van het feit dat OR natuurlijk niet werkt is het probleem dat ik niet de max waarde met het getal "1" wil verlagen, maar een maand terug wil. Oftewel gewoon de tweede row in de tabel (wanneer je unique rows retrieved).

Kan iemand mij in de juiste richting sturen? Of gewoon bevestigen dat het niet kan ;)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
code:
1
2
3
SELECT *
FROM Tabel
WHERE Datum IN (SELECT TOP 3 Datum FROM Tabel ORDER BY Datum DESC)


Afhankelijk van je SQL dialect zul je de TOP moeten aanpassen naar iets anders.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • onne
  • Registratie: December 2000
  • Laatst online: 21:17
P_de_B schreef op vrijdag 10 december 2004 @ 11:51:
code:
1
2
3
SELECT *
FROM Tabel
WHERE Datum IN (SELECT TOP 3 Datum FROM Tabel ORDER BY Datum DESC)


Afhankelijk van je SQL dialect zul je de TOP moeten aanpassen naar iets anders.
Hmm, de TOP wordt niet ondersteund, kan ook geen alternatief vinden die hetzelfde doet.. :?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Hmm, DB2 toch?

code:
1
2
3
4
5
SELECT *
FROM Tabel
WHERE Datum IN 
   (SELECT  Datum FROM Tabel ORDER BY Datum DESC
    FETCH FIRST 3 ROWS ONLY)


Als dit niet werkt, welke exacte versie gebruik je?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Freee!!
  • Registratie: December 2002
  • Laatst online: 16:52

Freee!!

Trotse papa van Toon en Len!

P_de_B schreef op vrijdag 10 december 2004 @ 14:08:
Hmm, DB2 toch?

code:
1
2
3
4
5
SELECT *
FROM Tabel
WHERE Datum IN 
   (SELECT  Datum FROM Tabel ORDER BY Datum DESC
    FETCH FIRST 3 ROWS ONLY)


Als dit niet werkt, welke exacte versie gebruik je?
Ik zou dat "SELECT DISTINCT DATUM FROM ..." maken, er zou wel eens een datum een aantal keren in kunnen zitten.

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Mr. Liu schreef op vrijdag 10 december 2004 @ 14:35:
[...]

Ik zou dat "SELECT DISTINCT DATUM FROM ..." maken, er zou wel eens een datum een aantal keren in kunnen zitten.
Je hebt gelijk :)

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Kan je niet nog simpeler zoiets doen:
SELECT * FROM DATUM ORDER BY DATUM DESC LIMIT 1;

  • onne
  • Registratie: December 2000
  • Laatst online: 21:17
Hmm als ik deze code gebruik:

code:
1
2
3
4
5
SELECT * 
FROM Tabel WHERE 
(Tabel.Date IN 
(SELECT DISTINCT Tabel.DATE  FETCH FIRST 3 ROWS ONLY )
)


Krijg ik de foutmelding dat hij "FETCH" niet herkend. Wordt dus niet ondersteund in deze versie.

(zonder die FETCH regel retrieved hij gewoon de gehele Date column)

Ik gebruik DB2 versie 7. (maar niet direct door sql uit te voeren maar via access achtig programma, kan het probleem ook wel verergeren/veroorzaken)

[ Voor 27% gewijzigd door onne op 10-12-2004 14:59 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op vrijdag 10 december 2004 @ 14:46:
Kan je niet nog simpeler zoiets doen:
SELECT * FROM DATUM ORDER BY DATUM DESC LIMIT 1;
Dat geldt voor MySQL, we hebben het hier over DB2

Oops! Google Chrome could not find www.rijks%20museum.nl


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
onne schreef op vrijdag 10 december 2004 @ 14:56:
Hmm als ik deze code gebruik:

code:
1
2
3
4
5
SELECT * 
FROM Tabel WHERE 
(Tabel.Date IN 
(SELECT DISTINCT Tabel.DATE  FETCH FIRST 3 ROWS ONLY )
)


Krijg ik de foutmelding dat hij "FETCH" niet herkend. Wordt dus niet ondersteund in deze versie.
Moet je niet verplicht een ORDER BY opnemen, zoals ik in het voorbeeld had staan? FETCH moet volgens de boeken ondersteunt worden vanaf versie 7

Oops! Google Chrome could not find www.rijks%20museum.nl


  • onne
  • Registratie: December 2000
  • Laatst online: 21:17
P_de_B schreef op vrijdag 10 december 2004 @ 15:00:
[...]


Moet je niet verplicht een ORDER BY opnemen, zoals ik in het voorbeeld had staan? FETCH moet volgens de boeken ondersteunt worden vanaf versie 7
Als ik die ORDER BY d´r in stop geeft hij daar ook een foutmelding op dat hij ook die functie niet herkend.
Het probleem zit naar mijn idee gewoon in het feit dat ik in een access achtig programma zit te editten direct in de SQL. Dit geeft blijkbaar gewoon problemen.
Vrees dat het daarmee op houd.

In ieder geval bedankt voor alle reacties!
Pagina: 1