Проверить состояние в GROUP BY? - PullRequest
0 голосов
/ 17 февраля 2020

Возьмем данные этого примера:

ID    Status    Date
1     Pending   2/10/2020
2     Pending   2/10/2020
3     Pending   2/10/2020
2     Pending   2/10/2020
2     Pending   2/10/2020
1     Complete  2/15/2020

Мне нужен оператор SQL, который сгруппирует все данные, но вернет текущий статус. Таким образом, для идентификатора 1 группе требуется условие, которое возвращает только строку «Завершено», а также возвращает ожидающие строки для идентификаторов 2 и 3.

Я не на 100% могу записать условие для этого.

Может быть что-то вроде:

SELECT ID, Status, Date
FROM table
GROUP BY ID, Status, Date
ORDER BY ID

Проблема с этим в том, что полученные данные будут выглядеть так:

ID    Status    Date
1     Pending   2/10/2020
1     Complete  2/15/2020
2     Pending   2/10/2020
3     Pending   2/10/2020

Но мне нужно:

ID    Status    Date
1     Complete  2/15/2020
2     Pending   2/10/2020
3     Pending   2/10/2020

Что я могу сделать, чтобы проверить статус «Завершено», чтобы я мог вернуть только «Завершено» в группе?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Делать только GROUP BY столбец идентификатора. Используйте MIN(), чтобы выбрать Завершить до Ожидания.

SELECT ID, MIN(Status)
FROM table
GROUP BY ID
ORDER BY ID
1 голос
/ 17 февраля 2020

Чтобы использовать дату в качестве «индикатора последней строки», вы можете:

DECLARE @Src TABLE (
    ID int,
    Status varchar(20),
    Date Date
)

INSERT @Src VALUES
(1, 'Pending' ,'2/10/2020'),
(1, 'Complete' ,'2/15/2020'),
(2, 'Pending' ,'2/10/2020'),
(3, 'Pending' ,'2/10/2020');

SELECT TOP 1 WITH TIES *
FROM @Src
ORDER BY ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC)

Результат:

ID          Status               Date
----------- -------------------- ----------
1           Complete             2020-02-15
2           Pending              2020-02-10
3           Pending              2020-02-10
...