Ajustando datas de início e término sql

Sep 23 2020

Dado um conjunto de dados no 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

Aqui, o StoreID é a chave primária. Estou procurando uma consulta que alterará o valor da hora de término do primeiro registro para o valor presente na hora de início do próximo segundo registro. Para ser preciso, preciso procurar os registros que aconteceram no mesmo dia para a combinação PurchaseID e shopkeeperID em que a identificação do local é diferente para ambos e, em seguida, pegar a hora de início do registro posterior e atualizar o valor na hora de término da linha anterior.

Nota: Aqui, dei o tamanho da amostra de apenas dois, mas no meu conjunto de dados tenho mais de 2 com os cenários acima.

Meu conjunto de resultados deve ser:

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

Respostas

DanielG Sep 23 2020 at 21:03

Uma abordagem seria algo próximo a isso, embora uma sub-seleção não funcione tão bem quanto 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