我在 SQL Server 中工作,我有空表 Customer 和如下所示的表 Manager:
___________________________
| Manager |
|=========================|
| ID Cust RefDate |
|-------------------------|
| 1 A 2023-01-31 |
| 2 B 2023-02-28 |
| 3 C 2023-03-31 |
| 4 A 2023-04-30 |
| 5 B 2023-05-31 |
| 6 A NULL |
|________________________ |
然后,我从 Manager 表插入 Customer 表,现在 Customer 表如下所示:
_______________________________________
| Customer |
|=====================================|
| ID Cust FROM TO |
|------------------------------------ |
| 1 A NULL 2023-01-31 |
| 2 B NULL 2023-02-28 |
| 3 C NULL 2023-03-31 |
| 4 A NULL 2023-04-30 |
| 5 B NULL 2023-05-31 |
| 6 A NULL NULL |
|_____________________________________|
然后我使用以下更新代码:
;WITH From_Table AS
(
select CustomerName as CustomerName,
[SalesManager],
lag([To], 1) OVER(ORDER BY [CustomerKey] ASC) as TargetDate --, [To]
FROM Customer
)
UPDATE Customer
SET [Customer].[From] = DATEADD(day, 1, Max_From)
FROM
(
SELECT dd.CustomerName, dd.SalesManager, dd.[To], dd.[From], MAX(ff.TargetDate) as Max_From
FROM From_Table AS ff
INNER JOIN Customer AS dd
ON ff.CustomerName = dd.CustomerName AND ff.SalesManager = dd.SalesManager
GROUP BY dd.CustomerName, dd.SalesManager, dd.[To], dd.[From]
--HAVING dd.[To] IS NULL AND dd.[From] IS NULL
) AS final
INNER JOIN Customer fd
ON fd.CustomerName = final.CustomerName AND fd.SalesManager = final.SalesManager
WHERE fd.[From] IS NULL
我得到这个结果:
_______________________________________
| Customer |
|=====================================|
| ID Cust FROM TO |
|------------------------------------ |
| 1 A 2023-04-01 2023-01-31 |
| 2 B 2023-05-01 2023-02-28 |
| 3 C 2023-03-01 2023-03-31 |
| 4 A 2023-04-01 2023-04-30 |
| 5 B 2023-05-01 2023-05-31 |
| 6 A 2023-04-01 NULL |
|_____________________________________|
但我想要的是下面的结果:
_______________________________________
| Customer |
|=====================================|
| ID Cust FROM TO |
|------------------------------------ |
| 1 A NULL 2023-01-31 |
| 2 B 2023-02-01 2023-02-28 |
| 3 C 2023-03-01 2023-03-31 |
| 4 A 2023-04-01 2023-04-30 |
| 5 B 2023-05-01 2023-05-31 |
| 6 A 2023-06-01 NULL |
|_____________________________________|
你知道如何实现它吗? 另外,我想提一下,日期不会是月底和月初。
我想你正在寻找这样的东西:
LAG()
获取当前行之前的行。
UPDATE c
SET [FROM] = newFrom
FROM Customer c
JOIN (
select ID,
DATEADD(day, 1, lag([To]) OVER(ORDER BY ID)) as newFrom
FROM Customer
) s on s.ID = c.ID;