比较同一列oracle中的日期
Comparing dates in same column oracle
我有以下table
Project No
STAGES
completion date
PROJ_001
1
12-MAR-21
PROJ_001
2
14-MAR-21
PROJ_001
3
15-MAR-21
PROJ_001
4
18-MAR-21
PROJ_002
1
18-MAR-21
PROJ_002
2
19-MAR-21
PROJ_002
3
19-MAR-21
PROJ_002
4
23-MAR-21
假设 table 按项目编号和阶段排序。
我必须检查阶段 1 中的日期是否小于阶段 2
同样,第 2 阶段的日期应小于第 3 阶段
并且第 3 阶段的日期应小于第 4 阶段。
这应该发生在项目的所有阶段。
Project No
STAGES
completion date
output
PROJ_001
1
12-MAR-21
Correct
PROJ_001
2
14-MAR-21
Correct
PROJ_001
3
15-MAR-21
correct
PROJ_001
4
18-MAR-21
correct
PROJ_002
1
19-MAR-21
incorrect
PROJ_002
2
17-MAR-21
incorrect
PROJ_002
3
16-MAR-21
correct
PROJ_002
4
23-MAR-21
correct
此处项目2的阶段1不小于阶段2所以不正确。
默认情况下,第 4 阶段应该是正确的。
有人可以指导我吗?
如果一个阶段是“正确的”,如果它的时间顺序顺序等于阶段编号,那么问题就微不足道了。在回答我提出的问题时,OP 说“如果两个阶段之间的阶段是“错误的”,那么不得将所有阶段都视为错误”。我将其解释为:如果一个阶段在时间序列中的顺序等于阶段编号,则该阶段是“正确的”。
output
列可以通过直接在 case
表达式中比较阶段号和序列号来填充。像这样:
select project_no, stage, completion_date,
case row_number() over (partition by project_no
order by completion_date, stage)
when stage then 'correct' else 'incorrect' end as output
from the_table
order by {whatever} -- if needed
;
请注意,在示例数据中,有时 completion_date
列中的值相等。在那种情况下,我假设阶段以正确的顺序完成(因此,row_number()
分析函数的 order by
子句中的第二个标准)。
我有以下table
Project No | STAGES | completion date |
---|---|---|
PROJ_001 | 1 | 12-MAR-21 |
PROJ_001 | 2 | 14-MAR-21 |
PROJ_001 | 3 | 15-MAR-21 |
PROJ_001 | 4 | 18-MAR-21 |
PROJ_002 | 1 | 18-MAR-21 |
PROJ_002 | 2 | 19-MAR-21 |
PROJ_002 | 3 | 19-MAR-21 |
PROJ_002 | 4 | 23-MAR-21 |
假设 table 按项目编号和阶段排序。 我必须检查阶段 1 中的日期是否小于阶段 2 同样,第 2 阶段的日期应小于第 3 阶段 并且第 3 阶段的日期应小于第 4 阶段。
这应该发生在项目的所有阶段。
Project No | STAGES | completion date | output |
---|---|---|---|
PROJ_001 | 1 | 12-MAR-21 | Correct |
PROJ_001 | 2 | 14-MAR-21 | Correct |
PROJ_001 | 3 | 15-MAR-21 | correct |
PROJ_001 | 4 | 18-MAR-21 | correct |
PROJ_002 | 1 | 19-MAR-21 | incorrect |
PROJ_002 | 2 | 17-MAR-21 | incorrect |
PROJ_002 | 3 | 16-MAR-21 | correct |
PROJ_002 | 4 | 23-MAR-21 | correct |
此处项目2的阶段1不小于阶段2所以不正确。 默认情况下,第 4 阶段应该是正确的。
有人可以指导我吗?
如果一个阶段是“正确的”,如果它的时间顺序顺序等于阶段编号,那么问题就微不足道了。在回答我提出的问题时,OP 说“如果两个阶段之间的阶段是“错误的”,那么不得将所有阶段都视为错误”。我将其解释为:如果一个阶段在时间序列中的顺序等于阶段编号,则该阶段是“正确的”。
output
列可以通过直接在 case
表达式中比较阶段号和序列号来填充。像这样:
select project_no, stage, completion_date,
case row_number() over (partition by project_no
order by completion_date, stage)
when stage then 'correct' else 'incorrect' end as output
from the_table
order by {whatever} -- if needed
;
请注意,在示例数据中,有时 completion_date
列中的值相等。在那种情况下,我假设阶段以正确的顺序完成(因此,row_number()
分析函数的 order by
子句中的第二个标准)。