【发布时间】:2017-07-28 08:20:16
【问题描述】:
我想检查由CONTRACT_ID 划分的合同的连续性,但我只想检查 FLG = 0 的合同并按整个范围(与FLG=1)进行比较。例如,我将从 FLG=1 的行中获取第一个 date_to 并按每个日期范围进行比较。如果 date_to 在某个范围之间,那么我想对合同进行限定。下一个 date_to 和同样的情况。我不知道如何解决这个问题。一个大问题是我不能使用 PL/SQL。我可以用 SQL 来做吗?有人知道如何通过contract_id检查分区中合同的连续性吗?我不知道如何对分区中的记录进行排序。我尝试了一些代码,我正在放弃......
感谢您的每一个帮助。
| CONTRAC_ID | DATE_FROM | DATE_TO | FLG |
|------------ |----------------------- |----------------------- |--------- |
| 1 | 2016-01-01 00:00:00.0 | 2016-03-11 00:00:00.0 | 1 |
| 1 | 2016-04-15 00:00:00.0 | 2016-06-05 00:00:00.0 | 1 |
| 1 | 2016-05-10 00:00:00.0 | 2016-07-25 00:00:00.0 | 1 |
| 1 | 2016-07-25 00:00:00.0 | 2016-08-22 00:00:00.0 | 0 |
| 1 | 2017-01-19 00:00:00.0 | 2017-05-21 00:00:00.0 | 0 |
| 1 | 2017-03-05 00:00:00.0 | 2017-04-30 00:00:00.0 | 0 |
编辑:
在示例中: 我们有三个 FLG=0 的记录,所以我们在某个订单后获取第一个 date_to。我将使用“2016-08-22”,正确的程序应该检查每个日期范围的日期:
'2016-08-22' between '2016-01-01 00:00:00.0' AND '2016-03-11 00:00:00.0'
'2016-08-22' between '2016-04-15 00:00:00.0' AND '2016-06-05 00:00:00.0'
'2016-08-22' between '2016-05-10 00:00:00.0' AND '2016-07-25 00:00:00.0'
'2016-08-22' between '2017-01-19 00:00:00.0' AND '2017-05-21 00:00:00.0'
'2016-08-22' between '2017-03-05 00:00:00.0' AND '2017-04-30 00:00:00.0'
如果这些条件之一为 TRUE,则合同符合条件,否则不符合条件。
正确的SELECT 语句结果:
| CONTRAC_ID | DATE_FROM | DATE_TO | FLG | QUAL|
|------------ |----------------------- |----------------------- |--------- |-----|
| 1 | 2016-01-01 00:00:00.0 | 2016-03-11 00:00:00.0 | 1 | 1 |
| 1 | 2016-04-15 00:00:00.0 | 2016-06-05 00:00:00.0 | 1 | 1 |
| 1 | 2016-05-10 00:00:00.0 | 2016-07-25 00:00:00.0 | 1 | 1 |
| 1 | 2016-07-25 00:00:00.0 | 2016-08-22 00:00:00.0 | 0 | 0 |
| 1 | 2017-01-19 00:00:00.0 | 2017-05-21 00:00:00.0 | 0 | 0 |
| 1 | 2017-03-05 00:00:00.0 | 2017-04-30 00:00:00.0 | 0 | 1 |
最后一个合约将是合格的,因为'2017-04-30 00:00:00.0' 在一个范围之间:
2017-01-19 00:00:00.0 | 2017-05-21 00:00:00.0
前三行有 1 个因为 FLG=1
【问题讨论】:
-
您使用的是哪个版本的 Oracle?由于 MATCH RECOGNIZE 功能,使用 12c 处理这类事情要容易得多。
-
不幸的是 Oracle 11g
-
MATCH RECOGNIZE 比较当前行的下一个或上一个值,我需要检查每个 date_to 与所有日期范围。
-
实际上 MATCH RECOGNIZE 比您想象的要灵活得多。
-
无论如何,如果您要使用要比较的行注释样本数据,哪些行符合条件,哪些行不符合条件,这会有所帮助。另外,请解释您所说的使合同符合条件的意思。在 SELECT 语句中会是什么样子?