SQL Abfrage mit LIMIT/TOP-Alternative

Hallo zusammen,

habe habe eine SQL-Query-Verständnisfrage. Ich muss einen Query aufstellen, der mir z.B. die schnellsten 3 Personen aus einer Tabelle ‘rundenzeiten’ ausgibt.
Also eine TOP (k) - Abfrage. Ich darf leider keine Geschichten wie “LIMIT” oder “TOP” etc verwenden.

Annahme Tabelle:
‘roundtime’ => ‘firstname’, ‘lastname’, ‘speed’;
varchar, varchar, time;

Ich gehe davon aus, dass firstname und lastname zusammen den Primärschlüssel bilden.


Eine funktionierender Query wäre:

select * from roundtime r1 where 3 >= 
(select count(*) from roundtime r2 where r1.speed >= r2.speed)
order by r1.speed

Herausbekommen habe ich das durch herumspielen mit den Parameters. Literatur habe ich dazu auch gelesen, verstehe jedoch einige, wichtigen Detail nicht:

  1. Innerer SELECT: Warum muss ich hier r1.speed >= r2.speed machen, damit er mir die “schnellsten” rauswirft?
    Wörtlich hieße das doch "bei dem die äußere Geschwindigkeit (r1.speed) langsamer-gleich (>=) als die innere Geschwindigkeit (r2.speed)
  2. Äußerer SELECT: Hier muss ich “where 3 >=” schreiben, um die schnellsten 3 zu bekommen. Ich verstehe den Sinn bzgl. 3 >= nicht. Ich dachte, hier geht es quasi um das COUNT(*) aus der inneren Anweisung.

Wäre euch sehr dankbar, wenn mir das jemand erklären könnte.

Vielen Dank!!

Felix

Eine meiner Meinung nach vermutlich bessere Lösung wäre

SELECT *
FROM (
   SELECT name, 
          roundspeed,
          rank() over (order by roundspeed asc) as speed_rank
   FROM roundtime
) t
WHERE speed_rank <= 3

Damit wird für jeden Teilnehmer der “rank” bzgl der roundspeed errechnet und dann drei besten rausgefiltert.