У меня есть эта упрощенная таблица, документирующая некоторые прогоны заданий:
+----+-----------------------+--------+
| id | pit | stat |
+----+-----------------------+--------+
| 1 | '2018-09-21 12:00:00' | 'TEST' |
| 1 | '2018-09-20 12:00:00' | 'TEST' |
| 1 | '2018-09-19 12:00:00' | 'PROD' |
| 1 | '2018-09-18 12:00:00' | 'PROD' |
| 1 | '2018-09-17 12:00:00' | 'TEST' |
| | | |
| 2 | '2018-09-19 14:00:00' | 'TEST' |
| 2 | '2018-09-18 14:00:00' | 'TEST' |
| | | |
| 3 | '2018-09-19 15:00:00' | 'PROD' |
| 3 | '2018-09-18 15:00:00' | 'PROD' |
| 3 | '2018-09-17 15:00:00' | 'TEST' |
| | | |
| 4 | '2018-09-21 12:00:00' | 'PROD' |
| 4 | '2018-09-20 12:00:00' | 'PROD' |
+----+-----------------------+--------+
Теперь я хочу сделать следующее:
Для каждого идентификатора: Найти последний прогон задания.Если последний прогон имеет stat = 'PROD'
, верните только эту строку.Если последний прогон имеет stat = 'TEST'
, верните эту строку и дополнительно верните последний прогон с stat = 'PROD'
.
В настоящее время я запускаю этот SQL для получения самого последнего прогона PROD, а также самого последнего прогона TEST для каждого идентификатора:
SELECT t.*
FROM SOME_TABLE t
INNER JOIN (
SELECT id, MAX(pit) pit, stat
FROM SOME_TABLE
GROUP BY id, stat
) mt ON t.id = mt.id AND t.pit = mt.pit
ORDER BY id asc, pit desc;
SQL Fiddle
Теперь, чего мне не хватает, так это той части, которую я хочу отфильтровать с помощью stat = 'TEST'
, если есть более поздний запуск с stat = 'PROD'
.
Есть ли хороший способ?достижения этого в SQL?