【发布时间】:2020-12-17 08:31:51
【问题描述】:
我有一个表格,它给出了一个对象的历史。每次更改一行。 对于我的任务,我只对一个更改的字段感兴趣:状态。这是一个表格示例,缩小到一个对象,省略了许多列:
| OBJECT_ID | STATUS | CHANGE_DATE |
|---|---|---|
| 173129 | P | 2020-11-05 |
| 173129 | A | 2020-10-25 |
| 173129 | A | 2020-03-15 |
| 173129 | A | 2019-08-29 |
| 173129 | P | 2019-08-29 |
| 173129 | A | 2019-06-07 |
| 173129 | A | 2018-12-02 |
| 173129 | A | 2018-09-01 |
| 173129 | A | 2018-07-29 |
| 173129 | A | 2018-03-13 |
| 173129 | A | 2018-02-15 |
我需要以某种方式对这些实体进行分组,以找出状态何时更改并忽略其他行。
所以我做的是:
select OBJECT_ID ,
STATUS ,
MIN(CHANGE_DATE ) AS
CHANGE_DATE
FROM HISTORIC
GROUP BY OBJECT_ID , STATUS
order by OBJECT_ID desc, CHANGE_DATE desc
这工作了一段时间,但后来发现状态可以从 A(活动)多次更改为 P(待定),然后来回切换。 STATUS 还有几个可能的值。
对象最后一次挂起的日期对我来说更重要,而我的查询会在第一次状态更改时得到我。
我的预期结果可能是两件事之一:
- 包含所有状态更改行的表:
| OBJECT_ID | STATUS | CHANGE_DATE |
|---|---|---|
| 173129 | P | 2020-11-05 |
| 173129 | A | 2019-08-29 |
| 173129 | P | 2019-08-29 |
| 173129 | A | 2018-02-15 |
- 包含特定 STATUS 的最新状态更改的表格:
| OBJECT_ID | STATUS | CHANGE_DATE |
|---|---|---|
| 173129 | P | 2020-11-05 |
| 173129 | A | 2019-08-29 |
我有不少复杂的需求,比如
- 在特定日期处于活动状态但同时被设置为待处理的所有对象
【问题讨论】:
-
如果有人能为这个问题想出更好的标题,请随时更改。
-
请向我们展示您对上述数据样本的预期结果。
-
到目前为止你做了什么?
LAG解析函数是你的朋友;)
标签: sql oracle datetime gaps-and-islands