Ik heb de volgende querie:

SELECT player_organisations.naam,player_koersen.last_value,((player_koersen.difference/player_koersen.previous_value)*100) AS percentage,player_koersen.previous_value,datum
FROM player_organisations INNER JOIN player_koersen 
ON player_organisations.org_id = player_koersen.org_id
WHERE player_organisations.naam <> 'AEX-index' AND DAY(datum) = DAY(NOW()) 
GROUP BY player_koersen.org_id
ORDER BY percentage DESC LIMIT 5


In de tabel player_koersen staat een veld 'datum', voor de verschillende organisaties zijn er meerdere records in deze tabel, ik wil het meest recente record hebben dus iets in de trend van:
WHERE datum = meest recente. Ik heb geen idee hoe dit op te lossen is. De organisaties zijn namelijk ook al ingedeeld in groepen, dit maakt het nog moeilijker.
Zodra je groepeert op een bepaalde kolom, is het daarna natuurlijk onmogelijk om nog individuele records uit zo'n groep aan te spreken.

Daarbij snap ik sowieso niet waarom je in deze query een GROUP BY clause gebruikt aangezien je nergens een functie als COUNT(), MIN() of bijvoorbeeld SUM() gebruikt. Wat er nu dus gebeurt is dat er een willekeurig resultaat uit die groep getoond wordt en jij weet vervolgens niet welk resultaat dat is...

Het is om die reden dus ook niet mogelijk om alsnog te sorteren op individuele data en er zo voor te zorgen dat dat willekeurige record het record met de meest recente datum wordt.
Ik gebruik een group by, omdat een organisatie er verschillende keren in voorkomt.
Het probleem is als volgt: in een tabel 'player_organisations' staat een lijst met organisaties. In een andere tabel 'player_koersen' staan verschillende koersen van verschillende dagen van de verschillende organisaties. Nu wil ik de top 5 van stijgers hebben. Maar als ik het percentage van stijgers uitreken van de verschillende records in de koersen-tabel, komt een bedrijf hier natuurlijk vaker in voor, want op verschillende tijdstippen was een bedrijf de grootste stijger. Vandaar de group by. Ik snap dat het resultaat wat ik nu krijg niet het goede is. Maar ik zou even niet weten hoe dit op te lossen is.
Saimen schreef op 04.06.2007 12:39
Ik gebruik een group by, omdat een organisatie er verschillende keren in voorkomt.


Dan moet je DISTINCT gebruiken. GROUP BY is voor SUM() MAX() COUNT() enz..
Een disctinct zal niet werken, omdat een record niet dezelfde waarden bevat. Alleen een organisatie is hetzelfde, maar er kunnen wel 15 records zijn van hetzelfde bedrijf zijn, maar met verschillende koersen. Van deze 15 records wil ik de meest recente hebben dus.
Toch is een GROUP BY dan hier niet de juiste oplossing...

Maar om even te kijken naar je probleem en eens te zien of ik het juist schets:

Je hebt een tabel met organisaties. Je hebt daarnaast een tabel waarin je alle koerswijzigingen opslaat. De records in deze tabel bevatten een id van de organisatie, een koerswijziging, de nieuwe koers?, een tijdstip waarop deze koerswijziging binnenkomt etc...

Vervolgens wil je een top 5 van unieke stijgers hebben. Maar het lijkt me dat je hier nog een tijdspanne aan moet verbinden. Dus kun je nog even aangeven hoe je dat voor je ziet?
Ik zie geen andere oplossing dan een group by, maar goed....
Zoals jij het beschrijft is inderdaad de situatie. Ik wil deze stijging van weten van alleen vandaag. Dus vandaar: DAY(datum) = DAY(NOW()).
Ik ben een stapje verder:

SELECT player_organisations.naam,player_koersen.last_value,((player_koersen.difference/player_koersen.previous_value)*100) AS percentage,player_koersen.previous_value,MAX(datum) as datum 
FROM player_organisations INNER JOIN player_koersen 
ON player_organisations.org_id = player_koersen.org_id
WHERE player_organisations.naam <> 'AEX-index' AND DAY(datum) = DAY(NOW()) 
GROUP BY player_koersen.org_id
ORDER BY percentage DESC LIMIT 5

De waarde klopt nu. Maar het percentage nog niet, omdat de verkeerde 'previous_value' wordt gebruikt.

Reageren