Başlangıç ​​ve bitiş tarihlerini ayarlama sql

Sep 23 2020

MS SQL Server 2016'da bir veri kümesi verildiğinde

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

Burada StoreID birincil anahtardır. İlk kayıt bitiş zamanının değerini, sonraki ikinci kaydın başlangıç ​​saatinde bulunan değere değiştirecek bir sorgu arıyorum. Kesin olmak gerekirse, konum kimliğinin her ikisi için de farklı olduğu Satın Alma Kimliği ve mağaza sahibi kimliği kombinasyonu için aynı gün gerçekleşen kayıtları aramam ve ardından sonraki kaydın başlangıç ​​saatini alıp önceki satır bitiş saatindeki değeri güncellemem gerekiyor.

Not: Burada sadece iki örnek boyutu verdim, ancak veri kümemde yukarıdaki senaryolarla 2'den fazla var.

Sonuç setim şöyle olmalı:

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

Yanıtlar

DanielG Sep 23 2020 at 21:03

Bir yaklaşım buna yakın bir şey olabilir, ancak bir alt seçim SET SQL kadar iyi performans göstermeyecektir:

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