我正在使用一个表,该表维护每个键的记录历史,以及一个START_DATE
和END_DATE
字段,分别表示记录更改何时生效和失效:
| 关键|开始日期|结束日期|FIELD_ONE|领域二|
| --|--|--|--|--|
| 1 |2000-01-01| 2000-01-02| 10 | 20 |
| 1 |2000-01-03| 2000-01-04| 10 | 21 |
| 1 |2000-01-05| 2000-01-06| 11 | 21 |
| 1 |2000-01-07| 2000-01-08| 10 | 20 |
| 1 |2000-01-09| 2000-01-10| 10 | 21 |FIELD_TWO
与我的目的无关,所以我想在摘录中删除它。我最终得到了这样一张表:
| 关键|开始日期|结束日期|FIELD_ONE|
| --|--|--|--|
| 1 |2000-01-01| 2000-01-02| 10 |
| 1 |2000-01-03| 2000-01-04| 10 |
| 1 |2000-01-05| 2000-01-06| 11 |
| 1 |2000-01-07| 2000-01-08| 10 |
| 1 |2000-01-09| 2000-01-10| 10 |
但是现在,我的记录几乎彼此重复-START_DATE
和END_DATE
字段表示在我的子表中看不到的更改。所以我想把这个表“浓缩”成下面的结果:
| 关键|开始日期|结束日期|FIELD_ONE|
| --|--|--|--|
| 1 |2000-01-01| 2000-01-04| 10 |
| 1 |2000-01-05| 2000-01-06| 11 |
| 1 |2000-01-07| 2000-01-10| 10 |
如何做到这一点?
我天真地尝试在KEY
和FIELD_ONE
上使用GROUP BY
,并将MIN()
和MAX()
函数应用于START_DATE
和END_DATE
字段,但这对上面的示例不起作用,其中FIELD_ONE
在一个值(在本例中为10)之间来回变化。当然,你最终会得到以下结果:
| 关键|开始日期|结束日期|FIELD_ONE|
| --|--|--|--|
| 1 |2000-01-01| 2000-01-10| 10 |
| 1 |2000-01-05| 2000-01-06| 11 |
我正在使用PL/SQL,但只要PL/SQL具有相同的工具,就可以从其他SQL风格进行必要的翻译。
谢谢你,谢谢!
1条答案
按热度按时间3j86kqsm1#
这是一个缺口和岛屿问题。您可以使用传统的解决方案:
测试结果:
请参见db<>fiddle上的运行示例。