Sql 查找相似用户记录的脚本
Sql Script to find similar user records
我有 LawfirmUser table 和 FirstName
、LastName
和 userId
列
以下是 LawfirmUser
的一些示例数据
FirstName LastName userId
---------- ----------- ----------
Demo test1 1
Demo test1 2
Demo test1 3
Demo test2 4
Demo test2 5
Demo test3 6
Demo test4 7
我正在尝试编写一个脚本来查找具有相同名字和姓氏但不同用户 ID 的所有记录
查询应该return低于数据
FirstName LastName userId
---------- ----------- ----------
Demo test1 1
Demo test1 2
Demo test1 3
Demo test2 4
Demo test2 5
我是 sql 的新手,有人可以帮我查询吗?
这是它的工作原理
CTE1,CTE2 等在Sql服务器中称为通用Table表达式,作为临时tables
,不会被存储在内存中并在执行查询后被清除。
1. CTE1 - Selects 与 table 不同的值。例如,如果 table 有相同的 FirstName
、LastName
和 UserId
,我们应该避免这种情况,因为您需要找到相同的 FirstName
和 LastName
用于不同的 UserId
。
2. CTE2 - Select 来自 CTE1
我们将计算相同的 FirstName
和 LastName
用于不同的 UserId
。下图将解释COUNT(*) OVER(PARTITION BY FirstName,LastName)
的使用
3. 最后我们取CNT>1
.
的结果
这是工作查询。
;WITH CTE1 AS
(
SELECT DISTINCT * FROM YOURTABLE
)
,CTE2 AS
(
SELECT *, COUNT(*) OVER(PARTITION BY FirstName,LastName) CNT
FROM CTE1
)
SELECT FirstName,LastName,userId
FROM CTE2
WHERE CNT>1
自联接即可。
SELECT A.FirstName, A.LastName, A.userID
FROM lawfirmuser A
INNER JOIN lawFirmuser B
on A.FirstName = B.FirstName
and A.LastName = B.LastName
and A.UserID <> B.UserID
GROUP BY A.FirstName, A.LastName, A.userID
不过,可能还有更优雅的方法。如果 lawfirmuser 中存在相同的 first、last 和 userID,我认为这不会受到影响。
使用Window Function
;WITH cte
AS (SELECT *,
Row_number()OVER(PARTITION BY FirstName, LastName ORDER BY userid) rn
FROM YOURTABLE)
SELECT *
FROM cte a
WHERE EXISTS (SELECT 1
FROM cte b
WHERE a.FirstName = b.FirstName
AND a.LastName = b.LastName
AND rn > 1)
我有 LawfirmUser table 和 FirstName
、LastName
和 userId
列
以下是 LawfirmUser
FirstName LastName userId
---------- ----------- ----------
Demo test1 1
Demo test1 2
Demo test1 3
Demo test2 4
Demo test2 5
Demo test3 6
Demo test4 7
我正在尝试编写一个脚本来查找具有相同名字和姓氏但不同用户 ID 的所有记录
查询应该return低于数据
FirstName LastName userId
---------- ----------- ----------
Demo test1 1
Demo test1 2
Demo test1 3
Demo test2 4
Demo test2 5
我是 sql 的新手,有人可以帮我查询吗?
这是它的工作原理
CTE1,CTE2 等在Sql服务器中称为通用Table表达式,作为临时tables
,不会被存储在内存中并在执行查询后被清除。
1. CTE1 - Selects 与 table 不同的值。例如,如果 table 有相同的 FirstName
、LastName
和 UserId
,我们应该避免这种情况,因为您需要找到相同的 FirstName
和 LastName
用于不同的 UserId
。
2. CTE2 - Select 来自 CTE1
我们将计算相同的 FirstName
和 LastName
用于不同的 UserId
。下图将解释COUNT(*) OVER(PARTITION BY FirstName,LastName)
3. 最后我们取CNT>1
.
这是工作查询。
;WITH CTE1 AS
(
SELECT DISTINCT * FROM YOURTABLE
)
,CTE2 AS
(
SELECT *, COUNT(*) OVER(PARTITION BY FirstName,LastName) CNT
FROM CTE1
)
SELECT FirstName,LastName,userId
FROM CTE2
WHERE CNT>1
自联接即可。
SELECT A.FirstName, A.LastName, A.userID
FROM lawfirmuser A
INNER JOIN lawFirmuser B
on A.FirstName = B.FirstName
and A.LastName = B.LastName
and A.UserID <> B.UserID
GROUP BY A.FirstName, A.LastName, A.userID
不过,可能还有更优雅的方法。如果 lawfirmuser 中存在相同的 first、last 和 userID,我认为这不会受到影响。
使用Window Function
;WITH cte
AS (SELECT *,
Row_number()OVER(PARTITION BY FirstName, LastName ORDER BY userid) rn
FROM YOURTABLE)
SELECT *
FROM cte a
WHERE EXISTS (SELECT 1
FROM cte b
WHERE a.FirstName = b.FirstName
AND a.LastName = b.LastName
AND rn > 1)