Я создал следующий тестовый сценарий:
create table TaskProgress
(
TaskID int,
Progress int,
TaskCreationDate date
);
go
insert into TaskProgress values
(1, 10, '2019-04-06'),
(1, 20, '2019-04-07'),
(1, 30, '2019-04-08'),
(1, 60, '2019-04-09'),
(1, 80, '2019-04-10'),
(1, 90, '2019-04-11')
go
При этом ваш запрос, кажется, работает правильно. Как я и предполагал. (Единственное замечание: вам НЕ нужно указывать последний параметр TaskCreationDate в выражении таблицы, поскольку он не используется или не нужен в основном запросе.)
Вы действительно уверены, что у вас нет повторяющихся комбинаций TaskID и Progress в вашей таблице TaskProgress ???
Небольшое обновление:
Похоже, вы говорите, что хотите получить записи, которые соответствуют самой младшей TaskCreationDate. Это тоже возможно, конечно. Вы можете изменить свой запрос следующим образом:
select TaskProgress.*
from
(select
TaskID, Max(Progress) as Progress, Max(TaskCreationDate) as TaskCreationDate
from
TaskProgress
group by
TaskID) as MaxValueTable
join
TaskProgress on TaskProgress.TaskID = MaxValueTable.TaskID
and MaxValueTable.TaskCreationDate = TaskProgress.TaskCreationDate
and TaskProgress.Progress < 100
В этом случае вам не понадобится наибольший прогресс в выражении вашей таблицы; не используется.
Редактировать 2:
AAAAHHHHHH! Я понял! Я думаю ...
Вам нужно самое высокое значение прогресса, поскольку оно должно быть меньше 100. Поэтому вам, вероятно, следует проверить значение Progress табличного выражения вместо значения Progress TaskProgress.
Пожалуйста, попробуйте это:
select TaskProgress.*
from
(select
TaskID, Max(Progress) as Progress, Max(TaskCreationDate) as TaskCreationDate
from
TaskProgress
group by
TaskID) as MaxValueTable
join
TaskProgress on TaskProgress.TaskID = MaxValueTable.TaskID
and MaxValueTable.TaskCreationDate = TaskProgress.TaskCreationDate
and MaxValueTable.Progress < 100
Извините за путаницу.