SQL 查询获取新重复的行

时间:2021-05-06 14:29:59

标签: sql sql-server

假设我有这个表结构

User
====
*Id
*Email
*City
*DateCreated

使用此数据:

Id Email                           City         DateCreated
1  eleven@gmail.com                Hawkins      01-01-2018
2  jim.hopper@gmail.com            Hawkins      01-01-2018
3  mike.wheeler@gmail.com          Hawkins      01-01-2018
4  dustin.henderson@gmail.com      Hawkins      01-01-2018
5  eleven@gmail.com                Hawkins      01-01-2021
6  eleven@gmail.com                Pittsburgh   01-01-2021

我想运行一个查询,只返回最新的重复记录(相同的电子邮件和城市):

5  eleven@gmail.com                Hawkins      01-01-2021

3 个答案:

答案 0 :(得分:3)

你可以使用窗口函数来得到这个结果

SELECT *
FROM (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY t.Email, t.City ORDER BY t.DateCreated DESC) rn,
        COUNT(*)     OVER (PARTITION BY t.Email, t.City) cnt
    FROM yourTable t
) t
WHERE t.cnt > 1 AND t.rn = 1

如果您还想要完全没有重复的行,请移除 COUNT 及其过滤器。

答案 1 :(得分:1)

您可以使用 window functions 来完成。

;WITH FilteredResult AS (
    SELECT 
        Id,
        Email,
        City,
        DateCreated,
        DuplicatedRows  = ROW_NUMBER() OVER(PARTITION BY Email, City ORDER BY Id)
    FROM your_table_name
)
SELECT *
FROM FilteredResult
WHERE DuplicatedRows = 1

答案 2 :(得分:0)

在这种情况下,显示的记录不是重复的,因为城市与 ID 5 和 ID 6 不同。

但是您可能可以执行 row_number 函数并按电子邮件和创建日期进行分区。

这是一个很好的例子https://www.c-sharpcorner.com/blogs/rownumber-function-with-partition-by-clause-in-sql-server1