Если вы используете sql-server-2012 и выше, вы также можете использовать это.
DECLARE @T TABLE (id INT, category VARCHAR(5), [date] date, value int)
INSERT INTO @T VALUES
(1, 'a', '2013-01-02', 7),
(2, 'a', '2013-01-02', 2),
(3, 'a', '2013-01-01', 3),
(4, 'b', '2013-01-01', 1),
(5, 'b', '2013-01-02', 4),
(6, 'b', '2013-01-03', 5),
(7, 'c', '2013-01-03', 4),
(8, 'c', '2013-01-03', 8)
SELECT id, [date] FROM (
SELECT id, [date], RANK() OVER( PARTITION BY category order by [date] desc) RNK from @T
) AS t
WHERE RNK = 1
Результат:
id date
----------- ----------
1 2013-01-02
2 2013-01-02
6 2013-01-03
7 2013-01-03
8 2013-01-03