我有这张桌子:
SELECT * FROM #BH2
BookingID | Detail | CreatedAgentCode | ChangeDate
----------|------------------------------------------------------|------------------|--------------------------
196162093 | MRS LUCIENE CORREA correa MRS LUCIENE CORREA | lclisboa | 2015-01-18 13:29:35.130
196162093 | MRS LUCIENE CORREA LISBOA MRS LUCIENE CORREA correa | VOMATOS | 2015-01-18 13:25:26.420
Run Code Online (Sandbox Code Playgroud)
还有这个:
SELECT * FROM BookingPassengerVersion WHERE BookingID = 196162093 ORDER BY ModifiedDate DESC
BookingID | Title | FirstName | MiddleName | LastName | AgentCode | ModifiedDate
----------|-------------------------------------------------------|----------------------------
196162093 | MRS | LUCIENE | | CORREA | lclisboa | 2015-01-18 13:29:35.130
196162093 | MRS | LUCIENE | CORREA | correa | VOMATOS | 2015-01-18 13:25:26.420
196162093 | MRS | LUCIENE | CORREA | LISBOA | ADM | 2015-01-12 18:01:09.503
196162093 | MRS | LUCIENE | CORREA | LISBOA | ADM | 2015-01-12 18:01:05.227
Run Code Online (Sandbox Code Playgroud)
我需要一个新的列添加到old name和new name:
我试过这个查询:
BEGIN TRY DROP TABLE #FINAL_TABLE END TRY BEGIN CATCH END CATCH
SELECT DISTINCT
BH.BookingID,
-- S OldName,
(CASE WHEN _NewName.Title>'' THEN _NewName.Title+' ' ELSE '' END)+_NewName.FirstName+' '+ _NewName.MiddleName+' '+_NewName.LastName AS NewName,
BH.CreatedAgentCode,
BH.ChangeDate,
INTO #FINAL_TABLE
FROM #BH2 BH
CROSS APPLY
(
SELECT TOP 2
Title
, FirstName
, MiddleName
, LastName
FROM BookingPassengerVersion
WHERE BookingID = BH.BookingID
AND BH.ChangeDate = ModifiedDate
ORDER BY ModifiedDate DESC
) _NewName
Run Code Online (Sandbox Code Playgroud)
但我无法得到这个结果:
BookingID | OldName | NewName | Detail | CreatedAgentCode | ChangeDate
----------|---------------------------|---------------------------|-----------------------------------------------------|------------------|--------------------------
196162093 | MRS LUCIENE CORREA correa | MRS LUCIENE CORREA | MRS LUCIENE CORREA correa MRS LUCIENE CORREA | lclisboa | 2015-01-18 13:29:35.130
196162093 | MRS LUCIENE CORREA LISBOA | MRS LUCIENE CORREA correa | MRS LUCIENE CORREA LISBOA MRS LUCIENE CORREA correa | VOMATOS | 2015-01-18 13:25:26.420
Run Code Online (Sandbox Code Playgroud)
表# BH2有detail列,这列是Old name加号New name.
我需要old name和new name分成两列,所以我将使用BookingPassengerVersion具有更改历史记录的表.
名称是通过将所形成的title,first name,middle name和last name.
你可以试试这个。SQL小提琴
WITH cteBookingPassengerVersion AS
(
SELECT BookingID,
RTRIM(
CONCAT (
ISNULL(Title + ' ', ''),
ISNULL(FirstName + ' ', ''),
ISNULL(MiddleName + ' ', ''),
ISNULL(LastName, '')
)
) AS NAME,
ModifiedDate,
ROW_NUMBER()OVER(PARTITION BY BookingID ORDER BY ModifiedDate DESC) rowNum
FROM BookingPassengerVersion
)
SELECT cte.BookingID,
ctePrev.NAME AS OldName,
cte.NAME AS NewName,
bh.Detail,
bh.CreatedAgentCode,
bh.ChangeDate
FROM BH2 bh
JOIN cteBookingPassengerVersion cte ON bh.BookingID = cte.BookingID AND bh.ChangeDate = cte.ModifiedDate
LEFT JOIN cteBookingPassengerVersion ctePrev ON ctePrev.BookingID = cte.BookingId AND ctePrev.rowNum = cte.rowNum + 1
ORDER BY cte.BookingID, bh.ChangeDate DESC
Run Code Online (Sandbox Code Playgroud)
编辑 我更新了查询以按日期加入并获取所有预订的所有更新
要通过 BH2 中的 BookingID 过滤 CTE,您可以执行以下操作:
WITH cteBookingPassengerVersion AS
(
SELECT BookingID,
RTRIM(
CONCAT (
ISNULLLL(Title + ' ', ''),
ISNULL(FirstName + ' ', ''),
ISNULL(MiddleName + ' ', ''),
ISNULL(LastName, '')
)
) AS NAME,
ModifiedDate,
ROW_NUMBER()OVER(PARTITION BY BookingID ORDER BY ModifiedDate DESC) rowNum
FROM BH2
JOIN BookingPassengerVersion ON BH2.BookingID = BookingPassengerVersion.BookingID
)
Run Code Online (Sandbox Code Playgroud)
或者
WITH cteBookingPassengerVersion AS
(
SELECT BookingID,
RTRIM(
CONCAT (
ISNULLLL(Title + ' ', ''),
ISNULL(FirstName + ' ', ''),
ISNULL(MiddleName + ' ', ''),
ISNULL(LastName, '')
)
) AS NAME,
ModifiedDate,
ROW_NUMBER()OVER(PARTITION BY BookingID ORDER BY ModifiedDate DESC) rowNum
FROM BookingPassengerVersion
WHERE BookingID IN (SELECT BookingID FROM BH2)
)
Run Code Online (Sandbox Code Playgroud)
在处理大型数据集时,您应该尝试不同的方法。我什至会用临时表替换 cte,看看是否有帮助。检查您的执行计划,看看是否还需要任何索引。
临时表而不是 cte
SELECT BookingID,
RTRIM(
CONCAT (
ISNULLLL(Title + ' ', ''),
ISNULL(FirstName + ' ', ''),
ISNULL(MiddleName + ' ', ''),
ISNULL(LastName, '')
)
) AS NAME,
ModifiedDate,
ROW_NUMBER()OVER(PARTITION BY BookingID ORDER BY ModifiedDate DESC) rowNum
INTO #bpv
FROM BookingPassengerVersion
WHERE BookingID IN (SELECT BookingID FROM BH2)
SELECT cte.BookingID,
ctePrev.NAME AS OldName,
cte.NAME AS NewName,
bh.Detail,
bh.CreatedAgentCode,
bh.ChangeDate
FROM BH2 bh
JOIN #bpv cte ON bh.BookingID = cte.BookingID AND bh.ChangeDate = cte.ModifiedDate
LEFT JOIN #bpv ctePrev ON ctePrev.BookingID = cte.BookingId AND ctePrev.rowNum = cte.rowNum + 1
ORDER BY cte.BookingID, bh.ChangeDate DESC
Run Code Online (Sandbox Code Playgroud)