В случае Oracle вы можете использовать предложение KEEP
следующим образом:
SELECT t.id,
MAX(t.status) KEEP (DENSE_RANK LAST ORDER BY t."DATE") AS corresponding_status,
MAX(t."DATE") AS last_date
FROM tab t
GROUP BY t.id
ORDER BY 1
Для этого примера данных:
+----+---------+------------+
| ID | STATUS | DATE |
+----+---------+------------+
| 1 | Running | 2018-02-03 |
| 1 | Stopped | 2018-04-04 |
| 2 | Running | 2018-03-24 |
| 2 | Stopped | 2018-01-02 |
| 3 | Running | 2018-06-12 |
| 3 | Stopped | 2018-06-12 |
+----+---------+------------+
Это вернет этот результат:
+----+----------------------+------------+
| ID | CORRESPONDING_STATUS | LAST_DATE |
+----+----------------------+------------+
| 1 | Stopped | 2018-04-04 |
| 2 | Running | 2018-03-24 |
| 3 | Stopped | 2018-06-12 |
+----+----------------------+------------+
Как видно из этой SQL-скрипты .
Для случаев, когда у вас есть несколько записей в одной комбинации ID
и DATE
, онаЯ выберу одно значение STATUS
- в данном случае последнее (на основе алфавитно-цифровой сортировки), как я использовал MAX
на STATUS
.Часть LAST ORDER BY t."DATE"
соответствует тому, как мы выбираем DATE
значение в группе, т.е. путем выбора последнего DATE
в группе.
См. эту запись Oracle Docs для получения более подробной информации..