如何计算每个部门的重复工作

时间:2016-10-24 19:52:09

标签: sql oracle count

我目前正在尝试弄清楚如何计算已经发送到另一个部门的工作。

例如,如果我有一个从部门A开始的工作,然后被发送到部门B,除了那个计数应该是0,但如果它再次从部门B返回到部门A然后我需要它计数1.

如果然后从部门A到B,那将是相同的,因为在这种情况下,我们将有2个部门来回工作。

逻辑不是基于作业最初的起始位置,更多的是计算作业返回到之前在链中的部门的值,只要它已经变为不同的部分。介于两者之间。例如,根据时间值,我可能会遇到这样的情况:工作已在部门A中处理,有几次顺序,因此计数将保持为0.这只会在其他地方再次计算后再计算到原部门。

如果有人可以请我就如何编写此查询提出建议,目前我可以为每个部门编写一个计数,但如果工作已经在部门之前就可以了。

以下是我的create和insert语句。另外,为了澄清这一点,正在编写Oracle的第11版。

创建表

CREATE TABLE "TEST_COUNT"   
   ( "P_DATE" DATE,   
 "MAIN_DEPT" VARCHAR2(6 BYTE)  
  ) 

插入

Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('17-FEB-16 12:03:36','DD-MON-RR HH24:MI:SS'),'Dept A');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('17-FEB-16 12:16:00','DD-MON-RR HH24:MI:SS'),'Dept B');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('17-FEB-16 12:16:00','DD-MON-RR HH24:MI:SS'),'Dept A');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('17-FEB-16 12:16:03','DD-MON-RR HH24:MI:SS'),'Dept B');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('17-FEB-16 12:20:00','DD-MON-RR HH24:MI:SS'),'Dept B');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('17-FEB-16 12:21:00','DD-MON-RR HH24:MI:SS'),'Dept B');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('17-FEB-16 12:33:49','DD-MON-RR HH24:MI:SS'),'Dept A');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('17-FEB-16 12:49:00','DD-MON-RR HH24:MI:SS'),'Dept A');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('04-APR-16 21:44:00','DD-MON-RR HH24:MI:SS'),'Dept A');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('04-APR-16 21:44:00','DD-MON-RR HH24:MI:SS'),'Dept B');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('04-APR-16 21:44:54','DD-MON-RR HH24:MI:SS'),'Dept B');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('04-APR-16 21:50:00','DD-MON-RR HH24:MI:SS'),'Dept B');  
Insert into TEST_COUNT (P_DATE,MAIN_DEPT) values (to_date('04-APR-16 21:50:00','DD-MON-RR HH24:MI:SS'),'Dept B');  

1 个答案:

答案 0 :(得分:1)

我认为你的输入数据中存在拼写错误 - 时间戳可能都是不同的(重复在这个问题上真的没有意义)。此外,如果您在某处有job_id列,则解决方案几乎不会发生任何变化 - 您需要将job_id添加到SELECTGROUP BYORDER BY子句,并将partition by job_id添加到lag()的分析子句中。

解决方案的工作原理是,只要null发生变化(包括第一行),就会在行中添加0(或任何非MAIN_DEPT,确实!)的标志,并{{1 }} 除此以外。然后外部查询分组null(和MAIN_DEPT,如果它存在),计数标志(仅表示非空值),它只选择计数为2或更多的组,并减去1来自计数,因为这是你的要求。这是 start-of-group 技术的直接应用(我在此解决方案中使用的技术名称)。

job_id