Самый последний план работы для всех пользователей:
SELECT
WP1.*
FROM
Workplans WP1
LEFT OUTER JOIN dbo.Workplans WP2 ON
WP2.UserID = WP1.UserID AND
WP2.Date > WP1.Date
WHERE
WP2.WorkplanID IS NULL
Для данного набора пользователей напишите табличную функцию, которая превращает разделенный список идентификаторов в таблицу этих идентификаторов. Если вы будете искать вокруг, я знаю, что я разместил этот код здесь раньше. Тогда вы можете использовать:
SELECT
WP1.*
FROM
dbo.GetTableFromIDList(@id_list) U
INNER JOIN Workplans WP1 ON
WP1.UserID = U.ID
LEFT OUTER JOIN dbo.Workplans WP2 ON
WP2.UserID = WP1.UserID AND
WP2.Date > WP1.Date
WHERE
WP2.WorkplanID IS NULL
Для заданного набора пользователей верните все их текущие проекты:
SELECT
P.*
FROM
dbo.GetTableFromIDList(@id_list) U
INNER JOIN Workplans WP1 ON
WP1.UserID = U.ID
LEFT OUTER JOIN dbo.Workplans WP2 ON
WP2.UserID = WP1.UserID AND
WP2.Date > WP1.Date
INNER JOIN dbo.Projects P ON
P.WorkplanID = WP1.WorkplanID
WHERE
WP2.WorkplanID IS NULL
Конечно, вы должны перечислить имена столбцов вместо использования "*".