Vind Top 3 SQL

Status
Niet open voor verdere reacties.

allard1977

Gebruiker
Lid geworden
7 feb 2011
Berichten
215
Hallo Allemaal,

Ik heb een SQL Code voor het verkrijgen van de Top Drie van iedere Stamboomnr. dit werkt heel goed, Alleen als er vier records zijn en de laatste twee hebben de zelfde score.
dan krijg ik geen 3 records van Stamboomnr maar vier.

[SQL]SELECT t.Stamboomnr, t.Score, t.Time, t.Trail, t.Place, t.Quali, t.Division, t.StockKlasID
FROM Tbl09_Stock AS t
WHERE (((t.Score) In (SELECT top 3 [Score] from [Tbl09_Stock] as t1 where t1.Stamboomnr = t.Stamboomnr order by t1.Score Desc)))
ORDER BY t.Stamboomnr, t.Score DESC;
[/SQL]
ik heb al eens gespeeld met DISTINCT.

voorbeeldje van tabel E172856 geeft 4 records aan ik wil alleen 3 Records.

Stamboomnr
E140581
E140581
E140581
E163988
E163988
E163988
E172856
E172856
E172856
E172856
E178963
E178963
E178963
Score
95
90
77
115
110
99
110
100
99
99
125
122
110
Time
1199
1111
1100
2345
2345
1231
1234
2345
2345
1234
2233
1111
1010

Alvast heel erg bedankt.
 
Even een andere vraag, om het misschien makkelijker te maken: Klopt het dat je tabellen nummert? En met welk idee?
 
Betere vraag: post eens een voorbeeldje. Logisch dat je er meer krijgt als er duplicaten zijn. Je zult dan beter moeten filteren. En ik ga het niet nabouwen :).
 
Het probleem zit denk ik in:
Code:
WHERE t.Score In (SELECT  top 3 [Score] ........................)
Er zijn simpelweg 4 records in t die daar aan voldoen.

Ik denk dat er ook geen oplossing is. In je voorbeeld zijn er 2 regels met score 99. Ze hebben echter verschillende waardes in Time (en misschien ook nog wel in andere velden). Welke regel met score 99 moet er dan getoond worden?
 
Laatst bewerkt:
Met voorbeeldje bedoelen we, al jaren overigens, een database​ met het probleem, zodat we op de juiste manier kunnen kijken. Dan zou Peter geen opmerking hoeven te maken als:
Ik denk dat er ook geen oplossing is.
Ik denk namelijk dat het helemaal niet moeilijk is. Peter kan het dus niet, maar ik denk ik wel. Maar mij ontbreekt de tijd (lees: de zin) om het na te maken. Dat is aan jou, als vragensteller :).
 
het laagste getal in Time.
eruit
Ben zelf nog aan het zoeken geweest. alleen ik filter nu allebei 99 waardes van E172856 eruit.

[SQL]SELECT t.Stamboomnr, t.Score, t.Time, t.Trail, t.Place, t.Quali, t.Division, t.StockKlasID, Tbl03_Dogs.ArmnumberStock
FROM Tbl03_Dogs INNER JOIN Tbl09_Stock AS t ON Tbl03_Dogs.Stamboomnr = t.Stamboomnr
WHERE (((t.Score) In (SELECT top 3 [Score] from [Tbl09_Stock] as t1 where t1.Stamboomnr = t.Stamboomnr and t1.score <> (SELECT Min(Score) AS MinOfScore FROM Tbl09_Stock AS Dupe
WHERE (Dupe.Stamboomnr = t.Stamboomnr) ) order by t1.Score Desc)))
ORDER BY t.Stamboomnr, t.Score DESC , t.Time;[/SQL]

heb ook gespeeld met Time
WHERE (Dupe.Stamboomnr = t.Stamboomnr) AND (Dupe.Time > t.Time)) order by t1.Score Desc)))
dan lijkt hij alleen op Time te filteren. en verdwijnen soms de hoogste scores

Alvaste Bedakt als jullie me duwtje in de goeie richting sturen.
 
Peter kan het dus niet, maar ik denk ik wel.
Ben benieuwd hoe je van 4 verschillende rijen er 3 maakt zonder informatieverlies:D.

Overigens had ik al een voorbeeld van de database. Jij ook trouwens. Minpuntje is alleen dat de betreffende gegevens er niet inzitten.
 
Is niet moeilijk. In dit geval moet je dus op zoek naar een tweede parameter. En aangezien we de db niet hebben, wéten we dus niet of er meer gegevens voorhanden zijn. En wellicht dat TS kan aangeven op basis waarvan de selectie gemaakt kan worden. Maar ik zal nooi zonder de db te zien zeggen dat iets niet kan. Al was het maar omdat er altijd wel een TS bij zit die dat dan gelooft, en het er dan maar bij laat.
 
het laagste getal in Time.
eruit
Stel dat er bijvoorbeeld 3 scores zijn van 110. Wil je die dan alledrie zien (100 en 99 niet)? Of alleen de 110 met de hoogste time?

In theorie (en misschien ook in de praktijk) kan het voorkomen dat score en time gelijk zijn in meerdere rijen. Wat dan?
 
En toch doe ik niks zonder de db erbij. Veel succes dus, ik kan mijn tijd beter besteden!
 
Betse Peter,

het gaat om de 3 hoogste waardes. als het 3X110 is dan wil ik alle drie zien.

Groet Allard
 
het laagste getal in Time eruit
Zoiets?
Code:
SELECT t.Stamboomnr, t.Score, t.Time, t.Trail, t.Place, t.Quali, t.Division, t.StockKlasID FROM Tbl09_Stock AS t
WHERE Format(Score,"0000") & Format(Time,"0000") In (SELECT  top 3  Format(Score,"0000") & Format(Time,"0000") FROM [Tbl09_Stock] AS t1 WHERE t1.Stamboomnr = t.Stamboomnr ORDER BY  Format(Score,"0000") & Format(Time,"0000") DESC)
ORDER BY t.Stamboomnr, Format(Score,"0000") & Format(Time,"0000") DESC;
 
Laatst bewerkt:
Hallo Peter,

Ik wist niet dat je format in zo'n situatie kan gebruiken heel handig om te weten.

Heel erg bedankt.

Allard
 
Graag gedaan. Was een leuke uitdaging.

Je krijgt in bepaalde omstandigheden overigens nog steeds meer dan drie regels per stamboomnummer. En wel als de laatste van de drie combinaties van score en time meerdere keren voorkomt. Ik weet niet hoe groot de kans daarop is en hoe erg dat is. Ex aequo's kunnen in principe altijd voorkomen.
 
En tóch kan het simpeler:
Code:
SELECT t.Stamboomnr, t.Score, t.Time, t.Trail, t.Place, t.Quali, t.Division, t.StockKlasID FROM Tbl09_Stock AS t
WHERE [Score] & "_" & [Time]) In (SELECT  Top 3  Score & "_"& Time FROM [Tbl09_Stock] AS t1 WHERE t1.Stamboomnr = t.Stamboomnr ORDER BY  Score & "_"& Time DESC)
ORDER BY t.Stamboomnr, [Score] & "_" & [Time] DESC;
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan