我們有一組重復的用戶,我正在撰寫一個程序來合并它們。基本上選擇具有匹配名稱和 DOB 的所有用戶,然后我需要一個用戶 ID 串列來將它們合并在一起。下面是一個例子:
CREATE TABLE #tmpUsers (UserID Integer NOT NULL PRIMARY KEY, FullName NVARCHAR(50), Birthdate DATE);
INSERT INTO #tmpUsers (UserID, FullName, Birthdate)
VALUES
(120,'John Michael','1985-03-02'),
(45,'John Michael','1985-03-02'),
(60,'John Michael','1985-03-02'),
(33,'John Michael','1985-03-02'),
(12,'Tim Smith','1973-01-02'),
(16,'Tim Smith','1973-01-02'),
(29,'Jane Thomas','1990-06-20'),
(43,'Jane Thomas','1990-06-20'),
(8,'Jane Thomas','1990-06-20');
我正在構建的程序需要有一個按全名和 DOB 排序的新表,但具有當前和先前的 ID,以便它可以合并在一起,如下所示:
| 姓名 | 出生日期 | 合并自 | 合并到 |
|---|---|---|---|
| 簡·托馬斯 | 1990-06-20 | 8 | 29 |
| 簡·托馬斯 | 1990-06-20 | 29 | 43 |
| 約翰·邁克爾 | 1985-03-02 | 33 | 45 |
| 約翰·邁克爾 | 1985-03-02 | 45 | 60 |
| 約翰·邁克爾 | 1985-03-02 | 60 | 120 |
| 蒂姆·史密斯 | 1973-01-02 | 12 | 16 |
該程序基本上將最舊的值合并或折疊為最新的值,因此最終每個值只有一個用戶。我只是找不到任何好的方法來做到這一點,盡管我確信有一個簡單的 TSQL 方法。我希望有人就如何構建它提出建議。
最后,在我的流程運行后,它將擁有三個 ID 為 16、43、120 的用戶。其他用戶將被洗掉或停用,但只是讓查詢啟動流程是我被掛起的地方。
謝謝。
uj5u.com熱心網友回復:
這將做到:
SELECT *
FROM (
SELECT FullName as Name, BirthDate as DOB, UserID as [Merge From],
LEAD(UserID) OVER(PARTITION BY fullname, birthdate
ORDER BY fullname, birthdate, userid) as [Merge To]
from #tmpUsers
) t
WHERE [Merge To] IS NOT NULL
ORDER BY Name, DOB, [Merge From];
看到它在這里作業:
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=c2557bc038cab44ab000a1b35ab1563b
uj5u.com熱心網友回復:
這可以通過row_number選擇每組的最大值來解決:
with u as (
select UserId, FullName, BirthDate,
Row_Number() over(partition by FullName order by UserId desc) keepMe
from #tmpUsers
)
select UserId, FullName, BirthDate
from u
where KeepMe=1
uj5u.com熱心網友回復:
盡管我的建議采用不同的方法來解決根本問題,但為什么不運行這個簡單的查詢,
SELECT
MIN(UserID) AS MergeFrom,
MAX(UserID) AS MergeTo,
FullName,
BirthDate
FROM #tmpusers
GROUP BY
FullName,
BirthDate
HAVING MIN(UserID)<>MAX(UserID)
按照指示轉移用戶并回圈執行此操作,直到查詢回傳空結果集?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377495.html
標籤:查询语句
