Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据前几行的条件查找日期之间的差异_Sql_Oracle_Date_Plsql - Fatal编程技术网

Sql 如何根据前几行的条件查找日期之间的差异

Sql 如何根据前几行的条件查找日期之间的差异,sql,oracle,date,plsql,Sql,Oracle,Date,Plsql,这是我的桌子: CREATE TABLE ABC ( nekey NUMBER(5), seq number(20), task varchar2(10), status varchar2(10), entrydat date, findat DATE ); 价值观: insert into ABC (nekey, seq, task, status, entrydat, findat) values (1, 3, 'Bu

这是我的桌子:

CREATE TABLE ABC
 (
     nekey NUMBER(5), 
     seq number(20),
     task varchar2(10), 
     status varchar2(10),
     entrydat date, 
     findat DATE
  );
价值观:

insert into ABC (nekey, seq, task, status, entrydat, findat) values (1, 3, 'Build', 'Closed', 
to_date('08-01-2019', 'mm-dd-yyyy'), to_date('08-04-2019', 'mm-dd-yyyy'));

insert into ABC (nekey, seq, task,status, entrydat, findat) values (1, 6,'Paint','Open', null, 
null); 

insert into ABC (nekey,seq,  task,status, entrydat, findat) values (1, 9,'Assemble','Pending', null, 
null);

insert into ABC (nekey,seq, task,status, entrydat, findat) values (2, 3,'Build', 'Closed',
to_date('08-02-2019', 'mm-dd-yyyy'), to_date('08-05-2019', 'mm-dd-yyyy'));

insert into ABC (nekey,seq, task, status,entrydat, findat) values (2, 6,'Paint', 'Closed',
to_date('08-05-2019', 'mm-dd-yyyy'), to_date('08-09-2019', 'mm-dd-yyyy')); 

insert into ABC (nekey,seq, task, status,entrydat, findat) values (2,9, 'Assemble', 'Open', null, 
null);
现在我想得到如下输出:

对于每个键,任务按以下顺序排列

1) 建造

2) 油漆

3) 集合。((但我的数据有20多个任务)我以这3个任务为例)

因此,我必须计算“天”列,如所附图像所示

那么什么时候

1) 状态为关闭,然后为findate-entrydate

2) 当状态为Open或Null时(sysdate-Findate是前一个任务的)(我已经解决了第一个任务打开的情况,它是projectstartdate-entrydate)

3) 当状态为“挂起”时,则不进行计算

如何在Oracle SQL中实现这一点


请注意,CREATE TABLE和INSERT语句中有许多错误。特别是,INSERT语句创建了五行NEKEY=1,但您的输出显示了三行NEKEY=1(以及三行NEKEY=2)。下面显示的输出基于修复语句中的所有错误,并更改其中两个INSERT语句中的NKEY以匹配输出

您的问题的答案是
select
子句中的
case
表达式,在需要时使用分析
lag()
函数。对于NEKEY第一行的status OPEN,此查询将返回NULL。在你的原始帖子下给我的回复中,你说你可以自己处理(但是你提到了在你的帖子中没有出现的表达,所以我忽略了这一点-由你来解决,可能使用NVL(…)调用)


我们可以解决您发布的问题,但这可能不足以解决您的实际问题。具体来说:你说你有15个不同的“任务”,看起来它们是完全有序的。是什么命令的?您是否有一个“任务”表,其中显示每个任务及其顺序?如果是这样的话,也可以发布一个小样本(在本例中,一个小表,其中三行用于三个任务,两列用于“任务名称”和“序号”)。此外,如果第一个任务具有打开状态,那么前一个任务就没有FINDATE;FINDATE应该被视为空吗(在这种情况下,与SYSDATE的差异也为NULL)?是的,我可以修改这个问题,我已经解决了第一个任务为NULL的情况,我只需减去ProjectStartDate-EntryDate请运行CREATE TABLE和INSERT语句(在测试模式中,您可以从头重新创建表),并调试它们直到它们起作用。您的语句中有许多错误。我将在此处尝试Hi@mathguy,我还想知道是否可以减去findates。例如:当序列不在3中且状态为关闭时(2019年8月9日-2019年8月5日)就是4@StackOne-我不明白你的最后一个问题。这不是我的解决方案已经做的吗?我找到了我对上一个问题的答案:附件
select abc.*, 
       case status when 'Closed'  then findat - entrydat
                   when 'Pending' then null
                   else trunc(sysdate) - lag(findat) 
                                           over (partition by nekey order by seq) 
       end as days
from   abc
;

     NEKEY        SEQ TASK       STATUS     ENTRYDAT   FINDAT           DAYS
---------- ---------- ---------- ---------- ---------- ---------- ----------
         1          3 Build      Closed     08/01/2019 08/04/2019          3
         1          6 Paint      Open                                     22
         1          9 Assemble   Pending                                    
         2          3 Build      Closed     08/02/2019 08/05/2019          3
         2          6 Paint      Closed     08/05/2019 08/09/2019          4
         2          9 Assemble   Open                                     17