有人可以给我一个select语句,只检索每个用户具有最高(最大)年份的行吗?
Year User_ID Name City
===== ======= ===== =====
2001 1 Bob Mpls
2002 1 Bob Mpls
2003 1 Bob St Paul
2005 2 Mary New York
2010 2 Mary L.A.
...所以我想要的结果集是:
Year User_ID Name City
===== ======= ==== =====
2003 1 Bob St Paul
2010 2 Mary L.A.
答案 0 :(得分:2)
由于您没有提及任何RDBMS,因此该查询几乎适用于所有RDBMS。
SELECT a.*
FROM TableName a
INNER JOIN
(
SELECT Name, MAX(Year) Year
FROM TableName
GROUP BY Name
) b ON a.Name = b.Name
AND a.Year = b.Year
但是,如果您的RDBMS支持窗口函数,则可以使用ROW_NUMBER()
SELECT Year, User_ID, Name
FROM
(
SELECT Year, User_ID, Name,
ROW_NUMBER() OVER (PARTITION BY Name,
ORDER BY Year DESC) rn
FROM TableName
) x
WHERE x.rn = 1
答案 1 :(得分:1)
SELECT *
FROM Table a
WHERE a.Year = (
SELECT TOP 1 Year
FROM Table b
WHERE a.name = b.name
ORDER BY year DESC
)
不是我所知道的最好但很简单
答案 2 :(得分:0)
这应该有效:
SELECT MAX( Year ) Year, User_id, Name
FROM tableName
GROUP BY User_id, Name
答案 3 :(得分:0)
如果您告诉我们您正在使用的数据库,我可能会建议稍微好一点的查询,但这个很简单,应该适用于大多数数据库:
SELECT MAX(year), user_id, name
FROM myTable
GROUP BY user_id, name
答案 4 :(得分:0)
您可以按分组来实现结果,请参阅下面的示例。
create table #temp(year int,id int,name varchar(5),city varchar(20))
insert into #temp values (2001,1,'Bob','Mpls')
insert into #temp values (2002,1,'Bob','Mpls')
insert into #temp values (2003,1,'Bob','St Paul')
insert into #temp values (2005,2,'Mary','New York')
insert into #temp values (2010,2,'Mary','L.A.')
您可以选择使用此查询
SELECT t.year,t.id,t.Name,t.city
FROM #temp t
INNER JOIN
(
SELECT Name, MAX(Year) Year
FROM #temp
GROUP BY Name
) a ON t.Name = a.Name
AND t.Year = a.Year