Ajustement des dates de début et de fin SQL

Sep 23 2020

Étant donné un ensemble de données dans 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

Ici, le StoreID est la clé primaire. Je recherche une requête qui changera la valeur de l'heure de fin du premier enregistrement à la valeur présente dans l'heure de début du deuxième enregistrement suivant. Pour être précis, je dois rechercher les enregistrements qui se sont produits le même jour pour la combinaison PurchaseID et shopkeeperID où l'ID d'emplacement est différent pour les deux, puis saisir l'heure de début de l'enregistrement ultérieur et mettre à jour la valeur dans l'heure de fin de la ligne précédente.

Remarque: Ici, j'ai donné une taille d'échantillon de seulement deux, mais dans mon ensemble de données, j'en ai plus de 2 avec les scénarios ci-dessus.

Mon jeu de résultats devrait ressembler à:

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

Réponses

DanielG Sep 23 2020 at 21:03

Une approche serait quelque chose de proche de cela, bien qu'une sous-sélection ne fonctionnera pas aussi bien que 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