none
sql abfrage RRS feed

  • Frage

  • Hallo liebe Datenbank Community,

    folgende Herausforderung habe ich und zwar aus einer Tabelle:


    möchte ich folgendes Ergebnis erreichen (s.u.) 

    ist das mit sql möglich? suche die richtige SQL-Abfrage :-) 

    VG und danke für eure Hilfe 
    Fabi

    Donnerstag, 11. Juli 2019 07:05

Antworten

  • Es gibt hier sicherlich verschiedene Herangehensweisen; ich habe das mal so probiert:

    Im ersten Schritt unterteile ich die Zeiten in kommen und gehen:

    SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen';
    SELECT ID, TIME AS gehen_time FROM TABLE01 WHERE TYP = 'gehen';
    

    Dann nehme ich mir die kommen-zeiten und suche mir jeweils dazu die nächste kommen-zeit. Bei der letzten Zeit klappt das natülich nicht; da nehme ich dann eine Zeit, die definitiv höher sein muss:

    SELECT K1.*, ISNULL(MIN(K2.kommen_time), '2999-12-31') AS next_kommen
    FROM (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K1
    LEFT OUTER JOIN (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K2 ON K1.ID = K2.ID AND K1.kommen_time < K2.kommen_time
    GROUP BY K1.ID, K1.kommen_time
    ;
    

    Dieses Ergebnis joine ich dann mit den gehen-zeiten und zwar muss die gehen Zeit zwinschen der kommen-zeit und der nächstgrößeren kommenzeit liegen (bei gleicher ID). Voila:

    SELECT SEL1.ID, SEL1.kommen_time, G1.gehen_time
    FROM
    (
    	SELECT K1.*, ISNULL(MIN(K2.kommen_time), '2999-12-31') AS next_kommen
    	FROM (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K1
    	LEFT OUTER JOIN (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K2 ON K1.ID = K2.ID AND K1.kommen_time < K2.kommen_time
    	GROUP BY K1.ID, K1.kommen_time
    ) SEL1
    LEFT OUTER JOIN (SELECT ID, TIME AS gehen_time FROM TABLE01 WHERE TYP = 'gehen') G1 ON SEL1.ID = G1.ID AND SEL1.kommen_time <= G1.gehen_time AND G1.gehen_time < SEL1.next_kommen
    ;

    Donnerstag, 11. Juli 2019 08:08

Alle Antworten

  • Es gibt hier sicherlich verschiedene Herangehensweisen; ich habe das mal so probiert:

    Im ersten Schritt unterteile ich die Zeiten in kommen und gehen:

    SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen';
    SELECT ID, TIME AS gehen_time FROM TABLE01 WHERE TYP = 'gehen';
    

    Dann nehme ich mir die kommen-zeiten und suche mir jeweils dazu die nächste kommen-zeit. Bei der letzten Zeit klappt das natülich nicht; da nehme ich dann eine Zeit, die definitiv höher sein muss:

    SELECT K1.*, ISNULL(MIN(K2.kommen_time), '2999-12-31') AS next_kommen
    FROM (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K1
    LEFT OUTER JOIN (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K2 ON K1.ID = K2.ID AND K1.kommen_time < K2.kommen_time
    GROUP BY K1.ID, K1.kommen_time
    ;
    

    Dieses Ergebnis joine ich dann mit den gehen-zeiten und zwar muss die gehen Zeit zwinschen der kommen-zeit und der nächstgrößeren kommenzeit liegen (bei gleicher ID). Voila:

    SELECT SEL1.ID, SEL1.kommen_time, G1.gehen_time
    FROM
    (
    	SELECT K1.*, ISNULL(MIN(K2.kommen_time), '2999-12-31') AS next_kommen
    	FROM (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K1
    	LEFT OUTER JOIN (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K2 ON K1.ID = K2.ID AND K1.kommen_time < K2.kommen_time
    	GROUP BY K1.ID, K1.kommen_time
    ) SEL1
    LEFT OUTER JOIN (SELECT ID, TIME AS gehen_time FROM TABLE01 WHERE TYP = 'gehen') G1 ON SEL1.ID = G1.ID AND SEL1.kommen_time <= G1.gehen_time AND G1.gehen_time < SEL1.next_kommen
    ;

    Donnerstag, 11. Juli 2019 08:08
  • Es gibt hier sicherlich verschiedene Herangehensweisen; ich habe das mal so probiert:

    Im ersten Schritt unterteile ich die Zeiten in kommen und gehen:

    SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen';
    SELECT ID, TIME AS gehen_time FROM TABLE01 WHERE TYP = 'gehen';

    Dann nehme ich mir die kommen-zeiten und suche mir jeweils dazu die nächste kommen-zeit. Bei der letzten Zeit klappt das natülich nicht; da nehme ich dann eine Zeit, die definitiv höher sein muss:

    SELECT K1.*, ISNULL(MIN(K2.kommen_time), '2999-12-31') AS next_kommen
    FROM (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K1
    LEFT OUTER JOIN (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K2 ON K1.ID = K2.ID AND K1.kommen_time < K2.kommen_time
    GROUP BY K1.ID, K1.kommen_time
    ;

    Dieses Ergebnis joine ich dann mit den gehen-zeiten und zwar muss die gehen Zeit zwinschen der kommen-zeit und der nächstgrößeren kommenzeit liegen (bei gleicher ID). Voila:

    SELECT SEL1.ID, SEL1.kommen_time, G1.gehen_time
    FROM
    (
    	SELECT K1.*, ISNULL(MIN(K2.kommen_time), '2999-12-31') AS next_kommen
    	FROM (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K1
    	LEFT OUTER JOIN (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K2 ON K1.ID = K2.ID AND K1.kommen_time < K2.kommen_time
    	GROUP BY K1.ID, K1.kommen_time
    ) SEL1
    LEFT OUTER JOIN (SELECT ID, TIME AS gehen_time FROM TABLE01 WHERE TYP = 'gehen') G1 ON SEL1.ID = G1.ID AND SEL1.kommen_time <= G1.gehen_time AND G1.gehen_time < SEL1.next_kommen
    ;

    geniale Lösung.

    habe grade getestet und ging :-)

    VG

    fabi

    Donnerstag, 11. Juli 2019 08:49
  • Es gibt hier sicherlich verschiedene Herangehensweisen; ich habe das mal so probiert:

    Im ersten Schritt unterteile ich die Zeiten in kommen und gehen:

    SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen';
    SELECT ID, TIME AS gehen_time FROM TABLE01 WHERE TYP = 'gehen';

    Dann nehme ich mir die kommen-zeiten und suche mir jeweils dazu die nächste kommen-zeit. Bei der letzten Zeit klappt das natülich nicht; da nehme ich dann eine Zeit, die definitiv höher sein muss:

    SELECT K1.*, ISNULL(MIN(K2.kommen_time), '2999-12-31') AS next_kommen
    FROM (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K1
    LEFT OUTER JOIN (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K2 ON K1.ID = K2.ID AND K1.kommen_time < K2.kommen_time
    GROUP BY K1.ID, K1.kommen_time
    ;

    Dieses Ergebnis joine ich dann mit den gehen-zeiten und zwar muss die gehen Zeit zwinschen der kommen-zeit und der nächstgrößeren kommenzeit liegen (bei gleicher ID). Voila:

    SELECT SEL1.ID, SEL1.kommen_time, G1.gehen_time
    FROM
    (
    	SELECT K1.*, ISNULL(MIN(K2.kommen_time), '2999-12-31') AS next_kommen
    	FROM (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K1
    	LEFT OUTER JOIN (SELECT ID, TIME AS kommen_time FROM TABLE01 WHERE TYP = 'kommen') K2 ON K1.ID = K2.ID AND K1.kommen_time < K2.kommen_time
    	GROUP BY K1.ID, K1.kommen_time
    ) SEL1
    LEFT OUTER JOIN (SELECT ID, TIME AS gehen_time FROM TABLE01 WHERE TYP = 'gehen') G1 ON SEL1.ID = G1.ID AND SEL1.kommen_time <= G1.gehen_time AND G1.gehen_time < SEL1.next_kommen
    ;

    geniale Lösung.

    habe grade in MSSQL getestet und ging :-)

    hast du für 

    ISNULL(MIN(K2.kommen_time), '2999-12-31') AS next_kommen 

    vergleichbares MYSQL ? 

    VG

    fabi


    Donnerstag, 11. Juli 2019 10:13
  • ISNULL(MIN(K2.kommen_time), '2999-12-31') AS next_kommen vergleichbares MYSQL ? 

    Hi,

    MySQL Fragen solltest Du sinnvollerweise in einem MySQL Forum stellen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 11. Juli 2019 10:48
    Moderator
  • danke,

    mit IFNULL funktioniert auch unter MYSQL :-)

    VG
    fabi

    Donnerstag, 11. Juli 2019 11:03