Sql不同的行按行分组

时间:2012-05-09 15:11:05

标签: sql

任何人都可以帮助我知道如何为下面的表构建sql查询以获取具有最新日期的不同行(基于名称和日期)。

Date               Name     Score

2011-06-16 10:30   Johan    36    
2010-12-09 08:52   Thomas   32
2012-04-25 15:14   Jak      56
2008-09-07 11:57   Jak      64
2012-02-28 13:22   Jan      23 
2011-01-11 12:08   Thomas   22      
2008-10-06 12:22   Kane     54

因此,查询将显示第1,3,6,7行。

5 个答案:

答案 0 :(得分:2)

由于最大日期重复的问题,我正在做出贡献。以上所有都返回所有重复项。提问者可能只想要其中一行。

SELECT date, name, score
FROM (select *,
             row_number() over (partition by name order by date desc) as seqnum
      from table a
     ) a
WHERE seqnum = 1

这将枚举行,从最新日期向后计数开始。然后选择其中一个日期。

答案 1 :(得分:1)

假设您的RDMS不支持窗口功能,

SELECT a.*
FROM table1 a
INNER JOIN 
(
  SELECT name,MAX(date) as max_date -- date field may need escaping
  FROM table1 a
  GROUP BY name
)b ON (b.name = a.name AND a.date=b.max_date)

<强>更新

关注 Dems 评论,如果日期+名称不是唯一的,但您只想查看一次名称,

SELECT c.name,c.date, MAX(c.score) as max_score
FROM
(
 SELECT a.* 
 FROM table1 a
 INNER JOIN 
 (
  SELECT name,MAX(date) as max_date -- date field may need escaping
  FROM table1 a
  GROUP BY name
 )b ON (b.name = a.name AND a.date=b.max_date)
)c

答案 2 :(得分:1)

这样的事情应该有用......

SELECT date, name, score
FROM table a
WHERE date = (
    SELECT MAX(date)
    FROM table b
    WHERE a.name = b.name
)

答案 3 :(得分:1)

您可以使用以下内容:

select date, name, score
from temp t1
where date = (select max(date) from temp where t1.name = temp.name)

通过演示查看sql fiddle

答案 4 :(得分:-1)

select convert(varchar,date,103) as name_date, name from table1 where convert(varchar, date, 103) = (select convert(varchar,max(date),103) as n_date from table1)

这是在mssql数据库sql格式中不考虑时间的时候