[sql] select value bij laatste maand van tabel

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

  • FvH
  • Registratie: Oktober 2001
  • Laatst online: 07-01 13:55

FvH

Aan het typen...

Topicstarter
Allereerst sorry voor de wazige titel, zou niet weten hoe het beter te omschrijven in 1 regel.

Goed

ik heb een tabel
code:
1
2
3
4
5
6
7
c_id        b_id     iMonth
1            101      9
1            102      10
2            103      8
2            104      9
2            190      11
etc. etc.


nu moet ik van 1 c_id alleen het b_id hebben van de laatste maand. Dus in geval van c_id 1 is dat maand 10 dus b_id = 102

Ik heb al van alles geprobeerd, maar ik krijg het niet voor elkaar. Distinct kan niet, want dat gaat over meerdere columns heen en bij andere opties loop ik met de order en group by commando's vast omdat daar dezelfde columns in moeten als in de select. Ik heb al met de MAX functie geprobeerd, maar kom daar ook niet verder mee.

Iemand een suggestie? db draait op MS SQL 2K, dus mag eventueel specifieke sql voor ms sql zijn.

What are clouds made of? Linux servers mostly!


  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
FvH schreef op woensdag 24 januari 2007 @ 16:13:
Allereerst sorry voor de wazige titel, zou niet weten hoe het beter te omschrijven in 1 regel.

Goed

ik heb een tabel
code:
1
2
3
4
5
6
7
c_id        b_id     iMonth
1            101      9
1            102      10
2            103      8
2            104      9
2            190      11
etc. etc.


nu moet ik van 1 c_id alleen het b_id hebben van de laatste maand. Dus in geval van c_id 1 is dat maand 10 dus b_id = 102

Ik heb al van alles geprobeerd, maar ik krijg het niet voor elkaar. Distinct kan niet, want dat gaat over meerdere columns heen en bij andere opties loop ik met de order en group by commando's vast omdat daar dezelfde columns in moeten als in de select. Ik heb al met de MAX functie geprobeerd, maar kom daar ook niet verder mee.

Iemand een suggestie? db draait op MS SQL 2K, dus mag eventueel specifieke sql voor ms sql zijn.
Je hebt wel de functie FIRST, maar die werkt volgens mij niet op 2K.
Kan je geen subqueries gebruiken?

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 12:52

The Eagle

I wear my sunglasses at night

Probeer eens een inner join oid :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • mithras
  • Registratie: Maart 2003
  • Niet online
Kan je niet iets doen als
SQL:
1
SELECT b_id FROM table WHERE iMonth = (SELECT MAX iMonth FROM table WHERE c_id = 1)
/snelle sql modus waar nog veel fouten inzitten maar het idee er wel is...
edit:
Een max is sneller dan "ORDER BY c_id DESC LIMIT 1"

[ Voor 21% gewijzigd door mithras op 24-01-2007 16:31 ]


Verwijderd

SQL:
1
2
3
4
SELECT bla1.c_id, bla1.b_id, bla1.imonth
FROM bla AS bla1
WHERE bla1.c_id = [Parametervariabele]
AND bla1.imonth = (SELECT MAX bla2.imonth FROM bla AS bla2 WHERE bla2.c_id = bla1.c_id);


Volgens mij zou dit moeten werken...

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
SQL:
1
SELECT b_id FROM table WHERE iMonth = (SELECT MAX(iMonth) AS iMonth FROM table GROUP BY c_id)

Zoiets?

[ Voor 228% gewijzigd door Gonadan op 24-01-2007 16:28 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • lier
  • Registratie: Januari 2004
  • Laatst online: 16:39

lier

MikroTik nerd

Voordat wij (enthousiaste SQL-ers) hier FvH's huiswerk op zitten te lossen...wat heeft de TS en wat lukt er precies niet ?

offtopic:
Dit lijkt mij redelijk elementaire SQL query...

Eerst het probleem, dan de oplossing


  • FvH
  • Registratie: Oktober 2001
  • Laatst online: 07-01 13:55

FvH

Aan het typen...

Topicstarter
Verwijderd schreef op woensdag 24 januari 2007 @ 16:23:
SQL:
1
2
3
4
SELECT bla1.c_id, bla1.b_id, bla1.imonth
FROM bla AS bla1
WHERE bla1.c_id = [Parametervariabele]
AND bla1.imonth = (SELECT MAX bla2.imonth FROM bla AS bla2 WHERE bla2.c_id = bla1.c_id);


Volgens mij zou dit moeten werken...
helaas...
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

What are clouds made of? Linux servers mostly!


  • FvH
  • Registratie: Oktober 2001
  • Laatst online: 07-01 13:55

FvH

Aan het typen...

Topicstarter
lier schreef op woensdag 24 januari 2007 @ 16:29:
Voordat wij (enthousiaste SQL-ers) hier FvH's huiswerk op zitten te lossen...wat heeft de TS en wat lukt er precies niet ?

offtopic:
Dit lijkt mij redelijk elementaire SQL query...
het punt is dat ik alleen b_id nodig heb. Dus eigenlijk wil ik alleen b_id in mijn select hebben staan. Ik kan nu geen distinct gebruiken. Als een distinct op 1 kolom mogelijk is terwijl je ook nog andere kollomen kunt selecteren ben ik ook geholpen als je me kan vertellen hoe dit uit te voeren.
Voor zover ik weet gaat een distinct over alle columns heen die je opgeeft in de select.

What are clouds made of? Linux servers mostly!


  • FvH
  • Registratie: Oktober 2001
  • Laatst online: 07-01 13:55

FvH

Aan het typen...

Topicstarter
Gonadan schreef op woensdag 24 januari 2007 @ 16:24:
SQL:
1
SELECT b_id FROM table WHERE iMonth = (SELECT MAX(iMonth) AS iMonth FROM table GROUP BY c_id)

Zoiets?
Alles wat in je group by staat moet ook in je select staan. Dus dit werkt niet.

What are clouds made of? Linux servers mostly!


  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
FvH schreef op woensdag 24 januari 2007 @ 16:36:
Alles wat in je group by staat moet ook in je select staan. Dus dit werkt niet.
Nee, hoor, alles wat in je select staat moet in je group by staan, of door een aggregate functie behandeld worden. :)

En anders zet je toch gewoon c_id ook in de select? Maakt voor de werking weinig uit. ;)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

FvH schreef op woensdag 24 januari 2007 @ 16:33:
helaas...
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.
Wat heb je exact uitgevoerd dan?
Het lijkt me dat dit gewoon moet kunnen. Eventueel is dit nog om te schrijven naar een not exists, maar dat zou niet nodig moeten zijn.

Who is John Galt?


  • FvH
  • Registratie: Oktober 2001
  • Laatst online: 07-01 13:55

FvH

Aan het typen...

Topicstarter
Gonadan schreef op woensdag 24 januari 2007 @ 16:37:
[...]

Nee, hoor, alles wat in je select staat moet in je group by staan, of door een aggregate functie behandeld worden. :)

En anders zet je toch gewoon c_id ook in de select? Maakt voor de werking weinig uit. ;)
Probleem is echter wel dat die subquery alle max-months terug geeft en je dus geen 1 record hebt waardoor de subquery ook als dusdanig gebruikt mag worden.

Ik moet dus wel voor alle b_id's terug krijgen, maar alleen die van de laatste maand van een c_id.

What are clouds made of? Linux servers mostly!


Verwijderd

SQL:
1
2
3
4
5
6
select
    tabel1.b_id
from
    tabel as tabel1
where
    tabel1.iMonth = (select max(tabel2.iMont) from tabel as tabel2 where tabel1.c_id = tabel2.c_id)

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
FvH schreef op woensdag 24 januari 2007 @ 16:42:
[...]


Probleem is echter wel dat die subquery alle max-months terug geeft en je dus geen 1 record hebt waardoor de subquery ook als dusdanig gebruikt mag worden.

Ik moet dus wel voor alle b_id's terug krijgen, maar alleen die van de laatste maand van een c_id.
Als ik mij niet vergis is dat precies wat mijn functie doet. :)

Hij pakt van elke c_id de hoogste iMonth.
En dan pakt hij van elke hoogste iMonth de b_id.
Dat is toch wat je wilde hebben?
Heb je hem eigenlijk al getest? :)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • FvH
  • Registratie: Oktober 2001
  • Laatst online: 07-01 13:55

FvH

Aan het typen...

Topicstarter
Ik denk dat ik mijn probleem als volgt moet uitleggen.

Het krijgen van een lijst van c_id's met alleen de max-maand erbij is niet het probleem. Die had ik al. Het is meer een probleem hoe dan vervolgens met dat result de b_id te krijgen.

What are clouds made of? Linux servers mostly!


Verwijderd

justmental schreef op woensdag 24 januari 2007 @ 16:38:
[...]

Wat heb je exact uitgevoerd dan?
Het lijkt me dat dit gewoon moet kunnen. Eventueel is dit nog om te schrijven naar een not exists, maar dat zou niet nodig moeten zijn.
In Access (niet dat dat maatgevend is :+) werkt dat gewoon in ieder geval.
Verwijderd schreef op woensdag 24 januari 2007 @ 16:44:
SQL:
1
2
3
4
5
6
select
    tabel1.b_id
from
    tabel as tabel1
where
    tabel1.iMonth = (select max(tabel2.iMont) from tabel as tabel2 where tabel1.c_id = tabel2.c_id)
Dat is precies hetzelfde als mijn query, maar blijkbaar werkt dat niet?!

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
FvH schreef op woensdag 24 januari 2007 @ 16:45:
Ik denk dat ik mijn probleem als volgt moet uitleggen.

Het krijgen van een lijst van c_id's met alleen de max-maand erbij is niet het probleem. Die had ik al. Het is meer een probleem hoe dan vervolgens met dat result de b_id te krijgen.
Lees je de posts van anderen wel?
Je weet dat je met een subquery het tussenresultaat kunt gebruiken om een nieuw resultaat te krijgen?
Dus zoals in mijn query van alle hoogte iMonts per c_id de b_id's?

SQL:
1
SELECT b_id FROM table WHERE iMonth IN (SELECT MAX(iMonth) AS iMonth FROM table GROUP BY c_id)

Lees hem en probeer hem, anders weet ik het ook niet meer. :?
Ik weet niet of de syntax 100% correct is, ik kan hem hier niet testen. Maar het idee moet werken. :)
Syntax aangepast, dank aan justmental.

[ Voor 8% gewijzigd door Gonadan op 24-01-2007 16:54 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • foske
  • Registratie: Juli 2001
  • Laatst online: 24-11 20:38
Mis ik nu iets of werkt dit gewoon?

code:
1
SELECT TOP 1 b_id FROM table WHERE c_id = @id ORDER BY iMonth DESC

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Gonadan, die van jou gaat niet werken, de subquery levert meerdere rijen op en is gekoppeld met een =.

Als het dbms het ondersteunt zou zoiets wel kunnen met (c_id, imonth) in (select c_id, max(imonth)...

[ Voor 33% gewijzigd door justmental op 24-01-2007 16:52 ]

Who is John Galt?


  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
justmental schreef op woensdag 24 januari 2007 @ 16:51:
Gonadan, die van jou gaat niet werken, de subquery levert meerdere rijen op en is gekoppeld met een =.
Ah inderdaad, gebruik dan IN

@justmental hieronder, ik was te snel ;)
Al aangepast :)

[ Voor 29% gewijzigd door Gonadan op 24-01-2007 16:54 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Gonadan schreef op woensdag 24 januari 2007 @ 16:52:
Juist, en dat noemt men een join ;)

Google eens naar subqueries, dan zie je hoe het werkt. :)
Je zou kunnen joinen vanuit de subquery als je dat bedoelt, maar dat doe je niet.

Who is John Galt?


  • FvH
  • Registratie: Oktober 2001
  • Laatst online: 07-01 13:55

FvH

Aan het typen...

Topicstarter
Gonadan schreef op woensdag 24 januari 2007 @ 16:52:
[...]

Ah inderdaad, gebruik dan IN
Het moet natuurlijk wel de max-maand van dat specifieke c_id zijn en niet een random result van die subquery

What are clouds made of? Linux servers mostly!


  • DutchCommando
  • Registratie: November 2000
  • Laatst online: 15:55
Wat heb je zelf dan gemaakt. Want ik heb binnen twee minuten een query bedacht die prima werkt.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Waarom post je dit topic hier als je geen problemen hebt met een development tool maar met de beheersing van een taal? :) Waar hoort mijn topic?

DTE>>PRG

'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.

Pagina: 1