Anpassen von Start- und Enddaten SQL

Sep 23 2020

Gegeben ein Datensatz in MS SQL Server 2016

StoreID PurchaseID ShopID LocationID Starttime          Endtime
1020    20200102    9856  0010    2020-01-08 09:08:53  2020-01-08 09:11:52
1021    20200102    9856  0020    2020-01-08 09:09:48  2020-01-08 09:11:52

Hier ist die StoreID der Primärschlüssel. Ich suche nach einer Abfrage, die den Wert der Endzeit des ersten Datensatzes in den Wert ändert, der in der Startzeit des nächsten zweiten Datensatzes vorhanden ist. Um genau zu sein, muss ich nach Datensätzen suchen, die am selben Tag für die Kombination aus PurchaseID und ShopkeeperID aufgetreten sind, wobei die Standort-ID für beide unterschiedlich ist, und dann die Startzeit des späteren Datensatzes abrufen und den Wert in der vorherigen Zeilenendzeit aktualisieren.

Hinweis: Hier habe ich eine Stichprobengröße von nur zwei angegeben, aber in meinem Datensatz habe ich mehr als zwei mit den oben genannten Szenarien.

Meine Ergebnismenge sollte wie folgt aussehen:

StoreID PurchaseID  ShopkID LocationID Starttime         Endtime
1020    20200102    9856    0010  2020-01-08 09:08:53  2020-01-08 09:09:48
1021    20200102    9856    0020  2020-01-08 09:09:48  2020-01-08 09:11:52

Antworten

DanielG Sep 23 2020 at 21:03

Ein Ansatz wäre etwas in der Nähe davon, obwohl eine Unterauswahl nicht so gut funktioniert wie SET SQL:

UPDATE 
    T
SET
    T.purchaseendtime = 
        (
            SELECT TOP 1 
                purchasestarttime 
            FROM 
                TABLE_NAME T2
            WHERE 
                T2.PurchaseStartTime >  T.PurchaseStartTime
                AND T2.PurchaseID = T.PurchaseID
                AND T2.ShopkeeperID = T.ShopkeeperID
                AND T2.LocationID <> T.LocationID
                AND Convert(date, T2.PurchaseStartTime) = Convert(date, T.PurchaseStartTime)
            ORDER BY
                T2.PurchaseStarttime
        )
FROM 
    TABLE_NAME T