【发布时间】:2019-02-25 21:56:06
【问题描述】:
我有这个简化的表格记录了一些作业运行:
+----+-----------------------+--------+
| 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' |
+----+-----------------------+--------+
现在我想做以下事情:
对于每个 id:查找最新的作业运行。如果最新运行具有stat = 'PROD',则仅返回该行。如果最新运行具有stat = 'TEST',则返回该行并另外返回具有stat = 'PROD' 的最新运行。
目前我正在运行这个 SQL 以获得最近的 PROD 运行以及每个 id 的最近的 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;
现在我缺少的部分是,如果最近有 stat = 'PROD' 运行,我想过滤掉 stat = 'TEST' 运行。
有没有什么好的方法可以在 SQL 中实现这一点?
【问题讨论】:
-
id=2在stat列中没有值PROD。这个 id 应该返回什么? -
@OtoShavadze 在这种情况下,应该只返回最近的测试运行。
标签: sql select group-by db2 greatest-n-per-group