Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL: Liste mit Zeiträumen (https://www.delphipraxis.net/192267-sql-liste-mit-zeitraeumen.html)

Nersgatt 4. Apr 2017 12:31

Datenbank: mySql • Version: 5.6 • Zugriff über: SQL

SQL: Liste mit Zeiträumen
 
Moin!

Ich habe eine Tabelle mit Buchungen an bestimmten Tagen und Personen, denen die Buchungen zugeordnet sind.
Personen:
IDName
1Mustermann
2Meier

Buchungen:
IDPersonIDDatum
1104.04.2017
2105.04.2017
3106.04.2017
4204.04.2017
5205.04.2017
6206.04.2017
7108.04.2017
8209.04.2017
9210.04.2017
10211.04.2017

In der Liste können "Löcher" im Datum sein.
Mein Ziel ist es, eine Abfrage zu haben, in der ich eine Liste der Zeiträume zu den Personen bekomme.
Also das Ergebnis sähe aus:
PersonIDNameVonBis
1Mustermann04.04.201706.04.2017
1Mustermann08.04.201708.04.2017
2Meier04.04.201706.04.2017
2Meier09.04.201711.04.2017

Hat jemand eine clevere Idee, wie ich eine solche Abfrage formulieren könnte? Mir fällt so gar kein Ansatz ein.

madas 4. Apr 2017 12:51

AW: SQL: Liste mit Zeiträumen
 
Schon mal mit einer DB-Prozedur versucht?

jobo 4. Apr 2017 12:56

AW: SQL: Liste mit Zeiträumen
 
Zitat:

Zitat von Nersgatt (Beitrag 1366388)
Hat jemand eine clevere Idee, wie ich eine solche Abfrage formulieren könnte? Mir fällt so gar kein Ansatz ein.

Das sieht nach einer Window Function SQL aus.
Rank Over Partition by Name
oder sowas

Glaub mySQL kann das aber nicht. Aber wie so oft, gibt es für solche "Lücken" oft komplexere Alternativen (schwerer lesbar und idR langsamer als echte Window Funktionen)

Also frag mal das Netz nach "Rank Over Partition by Alternative mysql". Vielleicht findest Du da schon passende Beispiele mit mySQL "Übersetzung"

Jumpy 4. Apr 2017 15:19

AW: SQL: Liste mit Zeiträumen
 
Nur mal laut gedacht:

SQL-Code:
Select Basis.*,
  ( Select Min(B2.Datum) From Buchungen B2 Where B2.PersonID=Basis.PersonID
    AND B2.Datum>=Basis.Datum AND B2.Datum+1 not in
   (Select Datum From Buchungen Where PersonID=B2.PersonID)
  ) as Endedatum
From
(
Select
  B.PersonID, P.Name, B.Datum as Startdatum
From
  Buchungen B
Left Join
  Personen P
On P.ID=B.PersonID
Where B.Datum-1 not in (Select Datum From Buchungen Where PersonID=B.PersonID
) Basis

Order By 1,2

madas 4. Apr 2017 15:52

AW: SQL: Liste mit Zeiträumen
 
Zitat:

Zitat von Jumpy (Beitrag 1366415)
Nur mal laut gedacht:

SQL-Code:
Select Basis.*,
  ( Select Min(B2.Datum) From Buchungen B2 Where B2.PersonID=Basis.PersonID
    AND B2.Datum>=Basis.Datum AND B2.Datum+1 not in
   (Select Datum From Buchungen Where PersonID=B2.PersonID)
  ) as Endedatum
From
(
Select
  B.PersonID, P.Name, B.Datum as Startdatum
From
  Buchungen B
Left Join
  Personen P
On P.ID=B.PersonID
Where B.Datum-1 not in (Select Datum From Buchungen Where PersonID=B.PersonID
) Basis

Order By 1,2

Wenn man in der ersten Where Clausel
SQL-Code:
Basis.Datum
mit
SQL-Code:
Basis.Startdatum
ersetzt, dann funzt das in der Tat. :D

Jumpy 4. Apr 2017 16:14

AW: SQL: Liste mit Zeiträumen
 
Ich überlege gerade nochmal, ob man den Subselect fürs Endedatum nicht in die untere Abfrage mit aufnehmen kann, und sich so die äußere Abfrage sparen kann. Aber irgendein Denk(fehler?)/ansatz hatte mich da abgehalten.

Nersgatt 5. Apr 2017 06:04

AW: SQL: Liste mit Zeiträumen
 
So wie Jumpy es geschrieben hat, hab ich es nun gelöst.
Zum Glück kann ich die Buchungen vorher schon stark einschränken, so dass die Abfrage schnell genug läuft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz