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>))
Хотя бывают и противоположные случаи, мой опыт обычно состоит в том, чтобы не разбивать дату, а хранить ее как одно поле.