?
je nach RDBMS gibt es wahrscheinlich schöne Anweisungen um das, was du willst, zu machen.
Du musst natürlich auch über Spezialfälle nachdenken... z.B. was wenn es 6 Einträge mit gleicher masterID und gleichem datum gibt? Es wäre etwas willkürlich dann da einfach einen beliebigen Eintrag nicht zu selektieren... Das ist unter anderem ein Grund warum ich dein SQL-Statement nicht so gut finde. Ich kenne die Semantik von TOP jetzt aber nicht - also falls das berücksichtigt werden sollte - sorry...
Das wäre mal mein Ansatz:
Vorbemerkung:
- über die Performance kann man noch nachdenken
- das mit dem DateTime ist ein bisschen vereinfacht (ist allerdings keine Einschränkung)
select * from (
select t.id,t.masterid,t.datum,(
select count(*) from test t2 where t.masterid=t2.masterid and t.datum<t2.datum
) as rang
from test t
) as geranked
where rang<=4;
mit WITH wäre das ganze sogar etwas verständlicher
Test:
CREATE TABLE test
(
id int auto_increment primary key,
masterid int,
datum int
);
INSERT INTO test
(masterid, datum)
VALUES
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(1, 5),
(1, 6),
(2, 1),
(2, 2),
(2, 3),
(3, 2),
(3, 3),
(3, 5),
(3, 7),
(3, 11),
(3, 13),
(4, 12),
(4, 12),
(4, 12),
(4, 12),
(4, 12),
(4, 12),
(4, 2);
link: http://sqlfiddle.com/#!2/07d39/5