我有这张桌子:
CREATE TABLE [dbo].[Handshake]
(
[Report Year] [varchar](100) NULL,
[Status] [varchar](100) NULL,
[Update Time] [datetime] NULL,
[Process Time] [datetime] NULL
) ON [PRIMARY]
GO
一些示例数据:
Report Year Status Update Time Process Time
----------------------------------------------------------------
Test Loading 2020-09-23 12:53:41.417 NULL
2020 1+7 No Rejects 2020-09-23 12:46:41.417 NULL
2020 2+7 Reject(s) 2020-09-22 21:18:25.130 NULL
2020 2+7 Processed 2020-09-21 21:29:25.130 NULL
2020 2+7 Loaded 2020-09-21 21:19:25.130 NULL
2020 2+7 Loaded 2020-09-21 21:16:25.130 NULL
2020 2+7 Failed 2020-09-21 21:14:25.130 NULL
2020 2+7 Loaded 2020-09-21 20:15:25.130 NULL
我有以下步骤:
DECLARE
@ReportYearCmd VARCHAR(1000),
@CosCountCmd VARCHAR(1000),
@FranchiseCountCmd AS VARCHAR(1000),
@ProductCountCmd AS VARCHAR(1000);
WITH Validations AS
(
SELECT TOP (1) *
FROM [Handshake]
WHERE [Status] <> 'Loading'
ORDER BY [Update Time] DESC
)
UPDATE Validations
SET @ReportYearCmd = CASE
WHEN Report_Year_Count = 0
THEN NULL
ELSE 'SELECT DISTINCT [Report Year] AS [Report Year] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Report Year] WHERE [Report Year].[Report Year] = [Fact].[Report Year] );'
END,
@CosCountCmd = CASE
WHEN COS_Count = 0
THEN NULL
ELSE 'SELECT DISTINCT [Country Code] AS [COS - Country Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] );'
END,
@FranchiseCountCmd = CASE WHEN Franchise_Count = 0 THEN NULL
ELSE 'SELECT DISTINCT [Style Code] AS [Franchise - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Franchise] WHERE [Franchise].[Style Code] = [Fact].[Style Code] );'
END,
@ProductCountCmd = CASE WHEN Product_Count = 0 THEN NULL
ELSE 'SELECT DISTINCT [Style Code] AS [Product - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] );'
END,
[Status] = CASE
WHEN ( Report_Year_Count = 0 AND COS_Count = 0 AND Franchise_Count = 0 AND Product_Count = 0 ) THEN 'No Rejects'
ELSE 'Reject(s)'
END
我要更新握手表中状态IF中具有“已加载”或“已拒绝”的所有先前记录,而最新记录的状态为“未拒绝”,而不是“正在加载”,例如从样本数据中提取,即2020 1+7 No Rejects 2020-09-23 12:46:41.417 NULL
,并将其状态设置为“无拒绝”
因此,我需要在此处执行以下查询的查询:
[Status] = CASE
WHEN ( Report_Year_Count = 0 AND COS_Count = 0 AND Franchise_Count = 0 AND Product_Count = 0 ) THEN 'No Rejects'
ELSE 'Reject(s)'
END
因此,在运行更新的存储过程之后,生成的握手表应为:
Report Year Status Update Time Process Time
----------------------------------------------------------------
Test Loading 2020-09-23 12:53:41.417 NULL
2020 1+7 No Rejects 2020-09-23 12:46:41.417 NULL
2020 2+7 No Rejects 2020-09-22 21:18:25.130 NULL
2020 2+7 Processed 2020-09-21 21:29:25.130 NULL
2020 2+7 No Rejects 2020-09-21 21:19:25.130 NULL
2020 2+7 No Rejects 2020-09-21 21:16:25.130 NULL
2020 2+7 Failed 2020-09-21 21:14:25.130 NULL
2020 2+7 No Rejects 2020-09-21 20:15:25.130 NULL
答案 0 :(得分:1)
基于对您要更新的内容的描述,我认为这样的事情会起作用
数据
drop table if exists #handshake;
go
CREATE TABLE [dbo].#Handshake
(
[Report Year] [varchar](100) NULL,
[Status] [varchar](100) NULL,
[Update Time] [datetime] NULL,
[Process Time] [datetime] NULL
) ON [PRIMARY]
GO
insert #Handshake values
('Test','Loading','2020-09-23 12:53:41.417', NULL),
('2020 1+7','No Rejects','2020-09-23 12:46:41.417', NULL),
('2020 2+7','Reject(s)',' 2020-09-22 21:18:25.130', NULL),
('2020 2+7','Processed',' 2020-09-21 21:18:25.130', NULL),
('2020 2+7','Loaded','2020-09-21 21:19:25.130', NULL),
('2020 2+7','Loaded','2020-09-21 21:19:25.130', NULL),
('2020 2+7','Failed','2020-09-21 21:19:25.130', NULL),
('2020 2+7','Loaded','2020-09-21 21:19:25.130', NULL);
查询
with latest_cte as (
select top (1) *
from #handshake
where [status] <> 'loading'
order by [update time] desc)
update h
set [status]='No Rejects'
from #handshake h
join latest_cte lc on h.[Update Time]<lc.[Update Time]
where h.[status] in('Loaded', 'Reject(s)')
and lc.[status]='No Rejects';
输出
Report Year Status Update Time Process Time
Test Loading 2020-09-23 12:53:41.417 NULL
2020 1+7 No Rejects 2020-09-23 12:46:41.417 NULL
2020 2+7 No Rejects 2020-09-22 21:18:25.130 NULL
2020 2+7 Processed 2020-09-21 21:18:25.130 NULL
2020 2+7 No Rejects 2020-09-21 21:19:25.130 NULL
2020 2+7 No Rejects 2020-09-21 21:19:25.130 NULL
2020 2+7 Failed 2020-09-21 21:19:25.130 NULL
2020 2+7 No Rejects 2020-09-21 21:19:25.130 NULL