sql abfrage

Faabris

Benutzer
Beiträge
14
Hallo liebe Datenbank Community,

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

tab_01-jpg.1361


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

tab_02-jpg.1362

ist das mit sql abfrage möglich?

VG und danke für eure Hilfe
Fabi
 

Anhänge

  • tab_01.jpg
    tab_01.jpg
    17,3 KB · Aufrufe: 20
  • tab_02.jpg
    tab_02.jpg
    11,7 KB · Aufrufe: 18
Zuletzt bearbeitet von einem Moderator:
Werbung:
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.
 
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=*#
 
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=*#

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

danke trotzdem
Fabi
 
Werbung:
gibt es für MSSQL ne Lösung?

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.
 
Zurück
Oben