2014-10-08 93 views
0

我有以下数据:SQL查询保留最多2个重复记录

 Name ID Date 
     Dave | 123 | 1-2-2011 
     Jim | 123 | 1-3-2011 
     Mike | 123 | 1-10-2011 
     Bill | 111 | 1-2-2011 
     Henry | 222 | 1-3-2011 
     Larry | 222 | 1-4-2011 

我需要删除查询此降低:

 Jim | 123 | 1-3-2011 
    Mike | 123 | 1-10-2011 
    Bill | 111 | 1-2-2011 
    Larry | 222 | 1-4-2011 

即我想保留两个最新记录为每个ID。

我尝试这样做:

Delete FROM UserTable a 
WHERE 
Date <> (SELECT MAX(Date) FROM UserTable b WHERE a.ID = b.ID) 
AND ID IN (SELECT ID FROM UserTable GROUP BY ID HAVING COUNT(*) > 1) 

但只保留最新的1分独特的记录。

+0

我不是你问清楚的记录。 “2个最新记录是重复的”是什么意思?什么将记录定义为“独特”(不应该以某种方式通过唯一记录来记录所有记录?我不明白为什么Dave的记录不在输出中,而Bill则是。 – 2014-10-08 14:03:31

+0

在问题中包含您的查询会有帮助 – 2014-10-08 14:04:22

+1

我认为该帖子要求为每个(col2)最近的2个条目(col3)组成一个集合,但我不确定这个主题与此有什么关系,因为5可能因记录数量而异。 。 – xQbert 2014-10-08 14:06:40

回答

0

尝试类似的东西:

SELECT col1, col2, col3, COUNT(*) 
FROM (SELECT DISTINCT * FROM your_TableName) AS T1 
GROUP BY col2, col3 
+0

这是如何限制结果的,因此每个不同的col2值只有2条记录? – xQbert 2014-10-08 17:44:17

0

尝试使用下面这取决于你想请求尝试使用ASC或DESC

SELECT column_name,column_name 
FROM table_name 
ORDER BY column_name,column_name ASC|DESC; 

尝试也是对你的SQL阅读了一下这个代码http://www.w3schools.com/sql/sql_orderby.asp

+0

这将如何限制结果,以便每个不同的col2值只有2条记录? – xQbert 2014-10-08 17:43:41

+0

您可以使用最大功能或更大/更小/等于符号来限制。并只选择你想要调用的列。希望我明白你在说什么并正确回答你的问题......你应该在这里找到更多的帮助http://www.w3schools.com/sql/ – 2014-10-09 05:58:32

0

分区可用于保留多个副本。

delete from UserTable 
where (id, date) in ( 
     select id,date from (
      select id,date, 
        row_number() over (partition by id order by date desc) as temp 
      from UserTable) 
     where temp > 2 
); 

这个查询增加了行号为另一列由ID划分,按日期排序,然后删除那些具有行数大于2