假设我有这个表结构
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
答案 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