letzte 5 Einträge einer Historie



  • Hallo,

    bin wohl zu doof die passenden Wörter in die Suche einzugeben.

    Tabelle
    master: ID|...
    child: ID|master_ID|DateTime|...

    Ich probiere schon ein paar Tage mit JOIN's, es will mir aber nicht gelingen
    die TOP 5 Einträge aus Child je master_ID zu erhalten.

    Es muss durch JOIN also eine Schleife über alle master_ID erzwungen werden
    zu der jeweils die nach DateTime sortierten TOP 5 Child-Records gebunden werden.

    Besten Dank für Hilfe.

    Ich glaub ich habe ein Ansatz gefunden.

    SELECT DISTINCT ID, master_id, DateTime FROM child t1
    WHERE id IN (SELECT TOP 5 id FROM child t2 WHERE t2.master_id = t1.master_id ORDER BY DateTime DESC)
    ORDER BY master_id, DateTime DESC
    


  • 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


Log in to reply