Tsql 调整开始日期和结束日期

Tsql 调整开始日期和结束日期,tsql,Tsql,这里StoreID是主键。我正在寻找一个将第一条记录结束时间的值更改为下一条记录开始时间中存在的值的查询。准确地说,我需要查找PurchaseID和shopkeeperID组合在同一天发生的记录,其中位置id对于两者都不同,然后获取后面记录的开始时间,并更新前一行endtime中的值 注意:这里我只给出了两个样本大小,但在我的数据集中,我有两个以上的场景 我希望此更改只更新到在特定日期发生的记录。逻辑不应更新不在同一天发生的所有先前记录的结束日期。确切地说,我希望这个逻辑只更新那些在同一天使用不

这里StoreID是主键。我正在寻找一个将第一条记录结束时间的值更改为下一条记录开始时间中存在的值的查询。准确地说,我需要查找PurchaseID和shopkeeperID组合在同一天发生的记录,其中位置id对于两者都不同,然后获取后面记录的开始时间,并更新前一行endtime中的值

注意:这里我只给出了两个样本大小,但在我的数据集中,我有两个以上的场景

我希望此更改只更新到在特定日期发生的记录。逻辑不应更新不在同一天发生的所有先前记录的结束日期。确切地说,我希望这个逻辑只更新那些在同一天使用不同LocationID生成的实例

Given a data set 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
 1022    20200102    9856  0030    2020-01-09 09:08:53  2020-01-09 09:12:52 
 1023    20200102    9856  0040    2020-01-10 09:09:48  2020-01-10 09:13:52

我认为这就是您要寻找的,但是预期输出的最后两行具有没有意义的结束时间,因为它们不在原始数据集中。但是试一下,看看它是否能满足你的需要:

CREATE TABLE [dbo].[TestTab1](
StoreID [int] NOT NULL,
PurchaseID [int] NOT NULL,
ShopID [int] NOT NULL,
LocationID [int] NOT NULL,
starttime [datetime] NOT NULL,
Endtime [datetime] NOT NULL,
) ON [PRIMARY]

INSERT INTO [TestTab1]
VALUES (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'),
(1022,20200102,9856,0030,'2020-01-09 09:08:53','2020-01-09 09:11:52'),
(1023,20200102,9856,0040,'2020-01-10 09:09:48','2020-01-10 09:11:52')

Existing Data:
StoreID PurchaseID ShopID LocationID starttime Endtime
1020 20200102 9856 10 2020-01-08 09:08:53.000 2020-01-08 09:11:52.000
1021 20200102 9856 20 2020-01-08 09:09:48.000 2020-01-08 09:11:52.000
1022 20200102 9856 30 2020-01-09 09:08:53.000 2020-01-09 09:12:52.000
1023 20200102 9856 40 2020-01-10 09:09:48.000 2020-01-10 09:13:52.000

Final Result set:

StoreID PurchaseID ShopID LocationID starttime Endtime
1020 20200102 9856 10 2020-01-08 09:08:53.000 2020-01-08 09:09:48.000
1021 20200102 9856 20 2020-01-08 09:09:48.000 2020-01-08 09:11:52.000
1022 20200102 9856 30 2020-01-09 09:08:53.000 2020-01-09 09:12:52.000
1023 20200102 9856 40 2020-01-10 09:09:48.000 2020-01-10 09:13:52.000
编辑:

此查询只考虑使用不同的位置。您可以调整最内部的StoreID以使用MIN或MAX StoreID,具体取决于您是否希望更新最早或最新的记录:

UPDATE TestTab1
    SET Endtime = T2.NewEndDate
FROM TestTab1 T1
INNER JOIN
    (
        SELECT *,
        LEAD(Starttime,1,endtime) OVER (PARTITION BY ShopID, PurchaseID ,CAST(StartTime as DATE) ORDER BY StartTime) NewEndDate
        from TestTab1
    ) T2 on T1.StoreID = t2.StoreID
WHERE T2.NewEndDate <> T2.Endtime

这是一个比一个更有趣的问题吗?同样的问题,但希望提供更多关于示例表结构和示例数据的信息。
UPDATE TestTab1
    SET Endtime = T2.NewEndDate
FROM TestTab1 T1
INNER JOIN
    (
        SELECT T1.*,
            LEAD(T1.Starttime,1,endtime) OVER (PARTITION BY T1.ShopID, T1.PurchaseID ,CAST(T1.StartTime as DATE) ORDER BY T1.StartTime) NewEndDate
        FROM TestTab1 T1 
        INNER JOIN
            (SELECT MIN(StoreID) StoreID, PurchaseID, ShopID, LocationID, MAX(StartTime) StartTime
                FROM TestTab1
                GROUP BY PurchaseID, ShopID, LocationID
            ) t3  on t3.StoreID = t1.StoreID
    ) T2 on T1.StoreID = t2.StoreID
WHERE T2.NewEndDate <> T2.Endtime