MSSQL: Zeile nach Datums bereich auswählen

brauh

Mitglied
Hallo,

ich habe eine Tabelle ( FIELDHISTORY) mit folgenden Spalten (siehe Anhang):

Ticket Nr = mrId
Zeitstempel bei Statusänderung = mrTimestamp
Ticket Status = mrNEWFIELDVALUE

In der Tabelle sind alle Status Zustände eingetragen, die ein Ticket im Laufe der Zeit durchlaufen hat.
Ich möchte nun in einer Abfrage erstellen, die mir pro Ticket nur einen Status listet und zwar der am 01. eines Monats.

Da ich nur rudimentär SQL kann bitte ich um eure Unterstützung.
Ich denke die Abfrage müsste so sein das man pro Ticket und Zeile der Reihe nach durchgeht und prüft welcher Zeitbereich (Zeitstempel bis zum nächsten Zeitstempel) im 01. Tag des Monats lag.

Ich hoffe es ist etwas verständlich.
Wäre super wenn mir hier jemand weiterhelfen kann.

Vielen Dank schon mal.

VG
Burghard
 

Anhänge

  • Tabelle Fieldhistory.jpg
    Tabelle Fieldhistory.jpg
    163 KB · Aufrufe: 14

Sempervivum

Erfahrenes Mitglied
Ich denke die Abfrage müsste so sein das man pro Ticket und Zeile der Reihe nach durchgeht und prüft welcher Zeitbereich (Zeitstempel bis zum nächsten Zeitstempel) im 01. Tag des Monats lag.
Das tut die Datenbank für dich.
Ich nehme an, dass dies auf deine Datenbank zutrifft:
Datums- und Uhrzeitdatentypen und zugehörige Funktionen - SQL Server (Transact-SQL)
Wenn ich das richtig lese, gibt die Funktion DAY den Tag im Monat zurück. Und deine Spalte mrTimestamp ist vom Typ DATETIME? Dann müsste deine Abfrage so aussehen:
Code:
SELECT mrId, mrTimestamp, mrNEWFIELDVALUE
    FROM FIELDHISTORY
    WHERE DAY(mrTimestamp) = 1
 

brauh

Mitglied
Hallo Sempervivum, Danke für die Infos!

ja mrTimestamp ist vom Typ DATETIME.

Wo ich bisher scheitere ist
Beispiel:
Ticket ID 1234 Zeit = 27.01.2021 Status Open
Ticket ID 1234 Zeit = 05.02.2021 Status Closed

Am 01.02. hatte das Ticket noch den Status Open. Da es ja bis dahin keine neue Status Änderung gab. Wie muss meine Abfrage lauten, damit der Eintrag vom 27.01.2021 für den 01 des Monats gezählt wird.

Wenn ich dazu ein ein Tip bekommen könnte wäre super!

Danke aber schon einmal für die Rückmeldung

VG
Burghard
 

Sempervivum

Erfahrenes Mitglied
Willst Du das nur für ein einziges Ticket abfragen oder für alle?
Gibt ja fast nichts, was die Datenbank nicht kann, wahrscheinlich kennt einer der DB-Spezialisten eine Lösung nur mit einer Abfrage, ohne Nachverarbeitung.
 

brauh

Mitglied
Für alle Tickets also es würde auch genügen wenn ich eine feste Anzahl z.B. 80000 Datensätze vorgeben kann.
 

Sempervivum

Erfahrenes Mitglied
Mit Nachverarbeitung ist das kein Problem, Du hast den Ablauf ja schon beschrieben. Programmierst Du das in PHP und kannst PDO nutzen?
 

brauh

Mitglied
Leider nein. Die Nachbearbeitung wollte ich so gering wie möglich halten. Ich nutze Tableau mit einer Verbindung zur SQL Datenbank. Schaffe ich es in der SQL Abfrage nur die Datensätze anzuzeigen die ich auch auswerten möchte, dann brauche ich nur noch ein paar Filter in Tableau zu setzen.
 

brauh

Mitglied
Die SQL Abfrage muss auch nicht besonders performant sein. Da ich in Tableau die Daten speichere und mit sogenannten Extrakts arbeite und ich würde ohne zusätzliche Programmiersprachen / Modulen etc. auskommen.
 

Zvoni

Erfahrenes Mitglied
Was ist mit Sätzen, welche mehrmals am 01. eines Monats vorhanden sind?
Welcher von denen? Der erste? der letzte?

EDIT: Was ist mit Tickets, welche mehr als einen Monat laufen?
Beispiel:
Gestartet am 25.01.2021
Beendet/Current: Heute
Wir hätten zwei Monats-Erste (01.02.2021 und 01.03.2021).
Welcher soll gezeigt werden?

EDIT2: Kannst du mal deinen Screenshot als csv hier reinhängen?
 

Zvoni

Erfahrenes Mitglied
OK, nach ein wenig Recherche läufts wohl auf folgendes hinaus:
Lückenlose Calendar-Table/View mit nem LEFT JOIN auf deine Daten, und dort ein IFNULL kombiniert mit der LAG-Funktion auf das Status-Feld sollte es wohl richten, und dann sempers Lösung aus Post #2 auf das Result-Set anwenden