Sql 查找相似用户记录的脚本

Sql Script to find similar user records

我有 LawfirmUser table 和 FirstNameLastNameuserId 列 以下是 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 有相同的 FirstNameLastNameUserId,我们应该避免这种情况,因为您需要找到相同的 FirstNameLastName 用于不同的 UserId
2. CTE2 - Select 来自 CTE1 我们将计算相同的 FirstNameLastName 用于不同的 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)