在表中查找不同记录的最新月份和年份

时间:2011-12-07 10:58:50

标签: sql-server-2005 tsql

我有下表

Name   Subject      Month  Year
-----  -----------  -----  ----
Raju   History      1      2011
Ravi   Chemistry    10     2010
Raju   Computers    12     2011
Raju   Physics      10     2010
Raju   English      6      2011 
Ravi   Mathematics  10     2010
Sunil  English      5      2011
Raju   History      5      2011 
Raju   History      6      2011

我希望结果如下

Name   Subject      Latest_Month_Attended  Latest_Year_Attended
-----  -----------  ---------------------  --------------------
Raju   History      6                      2011 
Raju   Computers    12                     2011 
Raju   Physics      10                     2010
Raju   English      6                      2011 
Ravi   Chemistry    10                     2010
Ravi   Mathematics  10                     2010 
Sunil  English      5                      2011 

我想找到特定学生和主题的最新月份和年份

请帮助我获得上述结果

3 个答案:

答案 0 :(得分:3)

试试这个(已编辑):

select t1.Name, t1.Subject, max(month) as Latest_Month_Attended, t2.year as Latest_Year_Attended
from tab t1
join (
    select Name, Subject, max(year) as year
    from tab
    group by Name, Subject
) t2 on t1.name = t2.name and t1.subject = t2.subject and t1.year = t2.year
group by t1.Name, t1.Subject, t2.year

答案 1 :(得分:1)

WITH
  ranked_data AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY Name, Subject ORDER BY Year, Month) AS Rank,
    *
  FROM
    yourTable
)
SELECT
  *
FROM
  ranked_data
WHERE
  Rank = 1


但是,如果将年/月值合并到一个日期字段中 - 一切都变得简单得多......

SELECT Name, Subject, MAX(Date) FROM yourTable GROUP BY Name, Subject

您可以使用以下内容将日期舍入为一个月:
- DATEADD(month, 0, DATEDIFF(month, 0, <any date-time>))

虽然存在相反的情况,但我的经验通常是不打破日期,而是将其保留为单个字段。

答案 2 :(得分:-1)

一个解决方案:

select Name, Subject, Month as Latest_Month_Attended, Year as Latest_Year_Attended
from tab
group by Name, Subject
having 
    max( month) and max(Year);

结果:

Name        Subject     Latest_Month_Attended  Latest_Year_Attended
----------  ----------  ---------------------  --------------------
Raju        Computers   12                     2011                
Raju        English     6                      2011                
Raju        History     6                      2011                
Raju        Physics     10                     2010                
Ravi        Chemistry   10                     2010                
Ravi        Mathematic  10                     2010                
Sunil       English     5                      2011