sql-server 在Group By中选择非重复列

lf3rwulv  于 2022-10-31  发布在  其他
关注(0)|答案(1)|浏览(123)

我需要在“电子邮件地址”列表中查找重复的地址
也有可能LoginName除了后面有一个1之外完全相同,例如TomTom1,而CreatedDate接近(不到一分钟)
我不确定CreateDate是否是完全必需的,但到目前为止,我可以得到一个带有duplicate的电子邮件列表-然后我将其用作电子邮件的where子句:

SELECT * 
FROM WWW_Login nolock
WHERE EmailAddress IN (
                        SELECT EmailAddress FROM WWW_Login
                        GROUP BY EmailAddress
                        HAVING COUNT(EmailAddress) >1 )
    AND CreatedDate >= DATEADD(dd,-10,GETDATE())
ORDER BY LoginName asc

我想从这是只有那些帐户的登录名是喜欢自己XOR自己+1的列表
例如:

+--------------+------------------+------------------+
| LoginName    | EmailAddress     | CreatedDate      |
+--------------+------------------+------------------+
| Tom          | tom@email.com    | 28/10/2022 13:00 |
+--------------+------------------+------------------+
| Tom1         | tom@email.com    | 28/10/2022 13:01 |
+--------------+------------------+------------------+
| Chris        | chris@email.com  | 25/10/2022 13:00 |
+--------------+------------------+------------------+
| Chris1       | chris@email.com  | 25/10/2022 13:01 |
+--------------+------------------+------------------+
| Post.Malone  | postie@email.com | 27/10/2022 12:14 |
+--------------+------------------+------------------+
| Post.Malone1 | postie@email.com | 27/10/2022 12:15 |
+--------------+------------------+------------------+

不幸的是,目前,我无法让登录名订购“在同一时间”作为电子邮件地址。
如果我按LoginName排序,我可以得到一个名称相似但电子邮件不同的大组
如果我通过EmailAddres订购,我只会得到一个在一个电子邮件下拥有两个帐户的用户列表,以及我正在寻找的零星的“真正的”重复项
两者都不像上表

oymdgrw7

oymdgrw71#

这就是你想要的吗?

WITH TMP (LoginName, EmailAddress, CreatedDate) AS
(
    SELECT *
    FROM
    (
        VALUES
            ('Tom', 'tom@email.com', CONVERT(DATETIME,'2022-10-28 13:00')),
            ('Tom1', 'tom@email.com', CONVERT(DATETIME,'2022-10-28 13:00')),
            ('Tomas', 'tomas@email.com', CONVERT(DATETIME,'2022-10-28 13:00')),
            ('Tomas1', 'tomas@email.com', CONVERT(DATETIME,'2022-10-28 13:00')),
            ('Tomy', 'tomy@email.com', CONVERT(DATETIME,'2022-10-28 13:00')),
            ('Tomson', 'tomson@email.com', CONVERT(DATETIME,'2022-10-28 13:00')),
            ('Tomson2', 'tomyson@email.com', CONVERT(DATETIME,'2022-10-28 13:00'))
    )t(LoginName, EmailAddress, CreatedDate)
)

SELECT TMP1.LoginName, TMP1.EmailAddress, TMP1.CreatedDate
FROM TMP AS TMP1
INNER JOIN TMP AS TMP2 ON TMP1.EmailAddress = TMP2.EmailAddress AND (TMP1.LoginName + '1' = TMP2.LoginName OR TMP1.LoginName = TMP2.LoginName + '1')
ORDER BY TMP1.EmailAddress, TMP1.LoginName ASC

发件人:

| LoginName     | EmailAddress          | CreatedDate               |
|-----------    |-------------------    |-------------------------  |
| Tom           | tom@email.com         | 2022-10-28 13:00:00.000   |
| Tom1          | tom@email.com         | 2022-10-28 13:00:00.000   |
| Tomas1        | tomas@email.com       | 2022-10-28 13:00:00.000   |
| Tomas         | tomas@email.com       | 2022-10-28 13:00:00.000   |
| Tomy          | tomy@email.com        | 2022-10-28 13:00:00.000   |
| Tomson        | tomson@email.com      | 2022-10-28 13:00:00.000   |
| Tomson2       | tomyson@email.com     | 2022-10-28 13:00:00.000   |

实验结果:

| LoginName     | EmailAddress      | CreatedDate               |
|-----------    |-----------------  |-------------------------  |
| Tom           | tom@email.com     | 2022-10-28 13:00:00.000   |
| Tom1          | tom@email.com     | 2022-10-28 13:00:00.000   |
| Tomas         | tomas@email.com   | 2022-10-28 13:00:00.000   |
| Tomas1        | tomas@email.com   | 2022-10-28 13:00:00.000   |

相关问题