выберите последнюю строку с определенным условием - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть таблица 1 хода выполнения задачи, как это Таблица 1. Задание

ID | TaskID | IsPlanned | MondayOfWeekDate| Progress | UserID | TaskCreationDate
--------------------------------------------------------------------------------------------
18998 9917       1           2019-04-01    0           1150        2019-04-04 10:47:52.177

и мне нужно выбрать ход выполнения задачи с прогрессом <100, а TaskCreationDate самое позднее </p>

Я пытался использовать group by и max, но я все еще получаю дублированный результат

Вот мой SQL до сих пор

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.Progress = TaskProgress.Progress
                 and TaskProgress.Progress < 100

Я ожидал получить задание с самой поздней датой создания и самой высокой точкой прогресса

ID    | TaskID | IsPlanned | MondayOfWeekDate| Progress | UserID | TaskCreationDate 
--------------------------------------------------------------------------------------------
28885   19500       0           2019-03-25       90        1717   2019-03-25 07:57:36.560

Но я все еще получаю это

ID    | TaskID | IsPlanned | MondayOfWeekDate| Progress | UserID | TaskCreationDate 
--------------------------------------------------------------------------------------------
28885   19500       0           2019-03-25       90        1717   2019-03-25 07:57:36.560
28696   19500       0           2019-03-11       90        1717   2019-03-16 20:57:57.373
28569   19500       0           2019-03-04       90        1717   2019-03-09 11:29:49.010
28485   19500       0           2019-02-25       90        1717   2019-03-02 18:12:25.587
28368   19500       0           2019-02-18       90        1717   2019-02-23 17:59:21.973

Пожалуйста, помогите мне исправить. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 06 апреля 2019

Я создал следующий тестовый сценарий:

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

Извините за путаницу.

0 голосов
/ 06 апреля 2019

Просто используйте TOP и ORDER BY:

select top (1) tp.* 
from TaskProgress tp
where tp.Progress < 100
order by tp.Progress desc, TaskCreationDate desc;

Если вам нужно несколько строк в случае связей, используйте top (1) with ties.

0 голосов
/ 06 апреля 2019

Вы пропустили условие для MaxValueTable.TaskCreationDate = 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.Progress = TaskProgress.Progress
                 and TaskProgress.Progress < 100
                 and  MaxValueTable.TaskCreationDate = TaskProgress.TaskCreationDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...