比较同一列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 子句中的第二个标准)。