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