【问题标题】:Comparing dates in same column oracle比较同一列oracle中的日期
【发布时间】:2021-07-08 18:29:25
【问题描述】:

我有下表

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

假设表格按项目编号和阶段排序。 我必须检查第 1 阶段的日期是否小于第 2 阶段 同样,第 2 阶段的日期应小于第 3 阶段 第三阶段的日期应该小于第四阶段。

这应该发生在项目的所有阶段。

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 阶段应该是正确的。

有人可以指导我吗?

【问题讨论】:

  • 您必须告诉我们一些更复杂的情况。例如,如果第 1 阶段、第 2 阶段和第 3 阶段的日期完全相反,该怎么办?在那种情况下,第 2 阶段可以吗(只有第 1 阶段和第 3 阶段是错误的)?或者你认为这三个都是错的?这意味着,从本质上讲,两个“错误”阶段之间的阶段必须所有都被视为“错误”?
  • 换一种说法:如果你看一个特定的阶段,你必须确定它是否“正确”,这里有两种方法来看待它(在大多数情况下结果非常不同):( 1)看看它在“时间序列”中的位置是否等于它的阶段号;如果是这样,称其为“正确”。 (2)(更严格)查看是否所有较早的阶段都有更早的完成日期(比这一行),所有后面的阶段都有更晚的完成日期。只有当所有这些条件都为真时,才称该行“正确”。在这种解释中,可以认为“正确”的行数要少得多。
  • 第三种可能性(通常与上述 (1) 和 (2) 的结果也不同):如果所有 earlier 阶段都已经完成,则该行是“正确的”完全的;不要看后期阶段来比较。 重要提示:作为程序员,您不应该决定哪些选择对您的用户来说是正确的业务问题。除非您已经知道他们对问题的定义(并且您可以与我们分享),否则不要猜测。请业务用户澄清问题。
  • 嗨 Mathguy,如果两个阶段之间的阶段是“错误的”,那么所有阶段都不能被视为错误。
  • 更多观察。首先,“所需输出”中的数据与第一组数据不匹配。也就是说,第二个项目的完成日期完全不同。其次,在“期望的输出”中,第二个项目的日期,即第 3 阶段,是整个项目的最早日期。这怎么可能是“正确的”?你的问题是有道理的,但你的插图没有任何意义。看来你没太注意。

标签: oracle oracle11g oracle10g


【解决方案1】:

如果一个阶段是“正确的”,如果它的时间序列顺序等于阶段号,那么这个问题是微不足道的。在回答我提出的问题时,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 子句中的第二个标准)。

【讨论】:

  • 非常感谢@mathguy ..我用过同样的,它工作正常。
猜你喜欢
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2018-07-18
  • 2018-08-31
相关资源
最近更新 更多