Поиск последнего месяца и года в таблице для разных записей - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть следующая таблица

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 ]

3 голосов
/ 07 декабря 2011

Попробуйте это (отредактировано):

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 голос
/ 07 декабря 2011
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>))

Хотя бывают и противоположные случаи, мой опыт обычно состоит в том, чтобы не разбивать дату, а хранить ее как одно поле.

0 голосов
/ 11 декабря 2011

Одно решение:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...