如果最新记录状态匹配,则更新所有其他记录

时间:2020-10-05 21:32:26

标签: sql sql-server tsql

我有这张桌子:

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

1 个答案:

答案 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