返回非重复记录的SQL

问题描述:

我在尝试构建一个查询,它将按NameYear排序,筛选出年份较高的重复项并将这些记录返回到表中。我的数据目前看起来是这样的:返回非重复记录的SQL

ID-----Name-----Year 
1  Bob  2010 
2  John  2014 
3  Bob  2004 
4  Eric  2005 

的数据应该由Name然后其次由Year降序方式分类可主要排序,像这样:

ID-----Name-----Year 
3  Bob  2004 
1  Bob  2010 
4  Eric  2005 
2  John  2014 

然后复制Name记录应是过滤返回只有最低Year像这样:

ID-----Name-----Year 
3  Bob  2004 
4  Eric  2005 
2  John  2014 

我试过像SELECT DISTINCTHAVING COUNT但我似乎无法得到它。可能缺少一些简单的东西。任何帮助?

+0

您使用的是哪个数据库? – RedFilter 2012-07-18 19:32:36

+0

您的第一个数据示例与您的第二个数据不符。 – RedFilter 2012-07-18 19:40:01

+0

谢谢,我修好了。 – aus 2012-07-18 20:08:37

select ID, Name, Year 
from (
    select ID, Name, Year, Rank() over (partition by Name order by year) as Rank 
    from MyTable 
) t 
where Rank = 1 

SQL FIddle Example #1

如果您不能使用PARTITION,你可以这样做:

select m.ID, m.Name, m.Year 
from (
    select Name, min(Year) as MinYear 
    from MyTable 
    group by Name 
) mm 
inner join MyTable m on mm.Name = m.Name and mm.MinYear = m.Year 

SQL Fiddle Example #2

+0

谢谢。这是我需要的! – aus 2012-07-18 19:50:04

SELECT Name, MIN(Year) FROM table 
GROUP BY Name 
ORDER BY Name ASC 
+0

可能想要将年份更改为ASC – lusketeer 2012-07-18 19:32:58

+0

@ user1301840你是对的,正在阅读问题(“年份”以下降的方式)而不是看结果。 – Kermit 2012-07-18 19:34:23

+0

你能解决这个问题吗?从选择中删除“ID”。从订单中删除“年”。您的解决方案背后的想法很好,但查询不是。 – 2012-07-18 19:34:54

假设MySQL的

select min(id), name, min(year) 
from (
select distinct t1.id, t1.name, t2.year 
from tbl t1, tbl t2 
odrer by t1.name, t2.year 
) T 
group by name