La solución correcta es la de Miguel.
Un caso similar y típico es dada una lista de precios con diferentes fechas de vigencia, se requiere como resultado la lista a última vigencia de cada artículo para una fecha X.
m.FechaX = DATE(2017,1,1)
SELECT art.art_id, art.art_nombre, art.art_precio, art.art_fechavig FROM articulos art;
WHERE art.art_fechavig = (SELECT MAX(mx.art_fechavig) FROM articulos mx;
WHERE mx.art_id = art.art_id and art_fechavig<=m.FechaX)
* otra opción podría ser
m.FechaX = DATE(2017,1,1)
SELECT art.art_id, art.art_nombre, art.art_precio, art.art_fechavig FROM articulos art;
WHERE art.art_fechavig = (SELECT TOP 1 mx.art_fechavig FROM articulos mx;
WHERE mx.art_id = art.art_id and art_fechavig<=m.FechaX order by mx.art_fechavig desc)
* Saludos