1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

sql abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Faabris, 10 Juli 2019 um 12:47 Uhr.

  1. Faabris

    Faabris Benutzer

    Hallo liebe Datenbank Community,

    folgende Herausforderung habe ich und zwar aus einer Tabelle (mysql)

    [​IMG]

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

    [​IMG]
    ist das mit sql abfrage möglich?

    VG und danke für eure Hilfe
    Fabi
     

    Anhänge:

    Zuletzt von einem Moderator bearbeitet: 10 Juli 2019 um 16:15 Uhr
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from faabris order by time;
     id  |  typ   |        time         
    -----+--------+---------------------
     253 | kommen | 2019-07-08 09:55:00
     253 | gehen  | 2019-07-08 11:26:00
     253 | kommen | 2019-07-08 12:10:00
     253 | gehen  | 2019-07-08 13:58:00
    (4 rows)
    
    test=*# select f1.*, f2.time from faabris f1 left join lateral (select * from faabris where f1.id=id and typ = 'gehen' and time > f1.time order by time limit 1) f2 on (true) where f1.typ = 'kommen' order by f1.time;
     id  |  typ   |        time         |        time         
    -----+--------+---------------------+---------------------
     253 | kommen | 2019-07-08 09:55:00 | 2019-07-08 11:26:00
     253 | kommen | 2019-07-08 12:10:00 | 2019-07-08 13:58:00
    (2 rows)
    
    test=*#
    
    LATERAL JOIN kann MySQL aber vermutlich nicht.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    etwas schöner:

    Code:
    test=*# select f1.id, f1.time as kommen, f2.time as gehen from faabris f1 left join lateral (select * from faabris where f1.id=id and typ = 'gehen' and time > f1.time order by time limit 1) f2 on (true) where f1.typ = 'kommen' order by f1.time;
     id  |       kommen        |        gehen       
    -----+---------------------+---------------------
     253 | 2019-07-08 09:55:00 | 2019-07-08 11:26:00
     253 | 2019-07-08 12:10:00 | 2019-07-08 13:58:00
    (2 rows)
    
    test=*#
    
     
    Faabris gefällt das.
  4. Faabris

    Faabris Benutzer

    interessante Losung, join lateral kannte ich noch nicht :)
    aber wie du vermutet hast, Mysql kennt lateral nicht.

    danke trotzdem
    Fabi
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Faabris gefällt das.
  6. Faabris

    Faabris Benutzer

    gibt es für MSSQL ne Lösung?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    kenne MSSQL nicht gut genug. Man kann das sicherlich auch als ein Subselect umschreiben, würde dann auch in MySQL gehen. Mal als Schnellschuß aus der Hüfte:

    Code:
    test=*# select id, kommen, gehen from (select *, row_number() over (partition by id, kommen order by gehen) from (select f1.id, f1.time as kommen, f2.time as gehen from faabris f1, faabris f2 where f1.typ = 'kommen' and f2.typ = 'gehen' and f1.time < f2.time) foo) bar where row_number = 1;
     id  |       kommen        |        gehen       
    -----+---------------------+---------------------
     253 | 2019-07-08 09:55:00 | 2019-07-08 11:26:00
     253 | 2019-07-08 12:10:00 | 2019-07-08 13:58:00
    (2 rows)
    
    test=*#
    
    MSSQL kann wohl row_number(), MySQL nicht oder nur neueste Inkarnationen.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden