【发布时间】:2020-01-02 14:58:51
【问题描述】:
我需要返回更新了某个列的最后一条记录。 数据存储在 2 个表中:ClientInfo 和 ClientInfoHistory 两者都有大量数据,尤其是历史记录(它跟踪主表 ClientInfo 上的任何更改)。即使在 ClientInfo 中只更新了一个列,具有该更新之前版本的行将被插入到 ClientInfoHistory 中,其中包含审计信息(用户和更新该行的日期)。
所以我有兴趣返回每个 ClientID 更改 Flag3 的最大日期 + 更改该日期的用户和 Flag3 的值
整个脚本应该在一个存储过程中,以避免性能问题。
我的想法: 我使用整个客户的历史记录 + 实际数据创建一个临时表,然后比较 Flag3 以查看每个客户的该标志何时更改,并将其与 modifiedbyuserid 和 modifieddate 一起放入另一个临时表中。然后我为每个客户选择 max(modifiedDate)。
表格如下所示:
create table dbo.ClientInfo(
ClientID int,
Flag1 bit,
Flag2 bit,
Flag3 bit,
CreatedByUserID int not null,
CreatedDate datetime not null default getdate(),
ModifiedByUserID int not null,
ModifiedDate datetime not null default getdate(),
constraint PK_UserInfo primary key (ClientID)
)
create table dbo.ClientInfoHistory(
ClientInfoHistoryID bigint identity not null,
ClientID int,
Flag1 bit,
Flag2 bit,
Flag3 bit,
CreatedByUserID int not null,
CreatedDate datetime not null,
HistoryStartModifiedByUserID int not null,
HistoryStartDate datetime not null,
HistoryEndModifiedByUserID int not null,
HistoryEndDate datetime not null,
constraint PK_ClientInfoHistory primary key (ClientInfoHistoryID)
)
CREATE NONCLUSTERED INDEX ix_ClientInfoHistory_ClientID_HistoryDates
on dbo.ClientInfoHistory (ClientID, HistoryStartDate, HistoryEndDate)
包含整个客户历史记录 + 实际数据的临时表包含以下内容:
SELECT c.ClientID
,c.Flag3
,c.ModifiedDate as HistoryStartDate
,'9999-12-31' as HistoryEndDate
,c.ModifiedByUserId as HistoryStartModifiedByUserID
FROM dbo.ClientInfo c with (nolock)
UNION
SELECT
ch.ClientID
,ch.Flag3
,ch.HistoryStartDate
,ch.HistoryEndDate
,ch.HistoryStartModifiedByUserID
FROM dbo.ClientInfoHistory ch with (nolock)
insert into dbo.ClientInfo (ClientID, Flag1, Flag2, Flag3, CreatedByUserID, CreatedDate, ModifiedByUserID, ModifiedDate)
values
(1,0,0,1,1234,'2019-05-29 04:57:13.360', 1111,'2019-07-01 08:35:13.360'),
(2,0,1,0,1233,'2019-03-12 04:57:13.360', 1233, '2019-03-12 04:57:13.360')
insert into dbo.ClientInfoHistory (ClientID, Flag1, Flag2, Flag3, CreatedByUserID, CreatedDate, HistoryStartModifiedByUserID,HistoryStartDate, HistoryEndModifiedByUserID, HistoryEndDate )
values
(1,1,1,1,1234,'2019-05-29 04:57:13.360', 1234, '2019-05-29 04:57:13.360', 4321,'2019-05-31 04:57:13.360'),
(1,0,1,1,1234,'2019-05-29 04:57:13.360', 4321,'2019-05-31 04:57:13.360', 9871,'2019-06-02 06:27:13.360'),
(1,0,1,0,1234,'2019-05-29 04:57:13.360',9871,'2019-06-02 06:27:13.360', 8765,'2019-06-21 11:06:13.360'),
(1,0,0,0,1234,'2019-05-29 04:57:13.360',8765,'2019-06-21 11:06:13.360', 9871,'2019-06-22 06:27:13.360')
(1,0,0,1,1234,'2019-05-29 04:57:13.360',9871,'2019-06-22 06:27:13.360', 4321,'2019-06-25 08:35:13.360'),
(1,0,1,1,1234,'2019-05-29 04:57:13.360',4321,'2019-06-25 08:35:13.360', 1111,'2019-07-01 08:35:13.360')
所以例如上面...那个标志的变化是:
ClientID,Flag3,ModifiedByUserID,ModifiedDate
- 1、1、1234、29/05/2019
- 1, 0, 9871, 02/06/2019
- 1, 1, 9871, 22/06/2019***
- 2、0、1233、12/03/2019***
最终结果集应仅返回标有 *** 的那些行(每个 ClienID 的 Flag3 的最新版本)
我对我选择的整个过程不太满意,我正在寻找另一种性能更好的解决方案。我很高兴听到你们的一些想法
【问题讨论】:
标签: sql-server performance tsql