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

Sql 如何统计每个部门的重复工作,sql,oracle,count,Sql,Oracle,Count,我目前正在尝试计算如何计算在发送到另一个部门之前已经发送到某个部门的工作 例如,如果我有一个从a部门开始的作业,然后被发送到B部门,除此之外,计数不应为0,但如果它再次从B部门返回到a部门,则我需要它计数1 这将是相同的,如果它然后从A部门到B,因为在这种情况下,我们将有两个部门的计件工作来回 逻辑并不是基于作业最初从何处开始,而是更多地计算作业返回到链中以前所在部门的位置的值,只要作业在这两个位置之间是到了另一个部门。例如,根据时间值,我可能会遇到这样一种情况,即该工作已在a部门中完成,连续几

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

例如,如果我有一个从a部门开始的作业,然后被发送到B部门,除此之外,计数不应为0,但如果它再次从B部门返回到a部门,则我需要它计数1

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

逻辑并不是基于作业最初从何处开始,而是更多地计算作业返回到链中以前所在部门的位置的值,只要作业在这两个位置之间是到了另一个部门。例如,根据时间值,我可能会遇到这样一种情况,即该工作已在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');  

我假设您的输入数据中有输入错误-时间戳可能都是不同的(重复在这个问题上真的没有意义)。另外,如果您在某个地方有一个
job\u id
列,那么解决方案几乎没有变化-您需要将
job\u id
添加到
SELECT
groupby
ORDER BY
子句中,并将
partitionby job\u id
添加到
lag()
的分析子句中

该解决方案的工作原理是每当
MAIN\u DEPT
更改(包括第一行)时,向一行添加一个0标志(或者任何不是
null
,实际上!),否则为
null
。然后外部查询按
MAIN\u DEPT
(和
job\u id
(如果存在)分组,统计标志(仅表示非空值),它仅选择计数为2或更多的组,并从计数中减去1,因为这是您的要求。这是组开始技术(我在本解决方案中使用的技术名称)的直接应用


您需要作业的唯一标识符。否则,您将永远不会知道哪个记录是从一个部门传递到另一个部门的同一份工作。您需要添加一个额外的列(例如,JOB_ID),其中每个作业都有一个标识号,然后当一个作业从一个部门传递到另一个部门时,它会保持相同的标识。感谢您的回复。目前我所拥有的只是主工作id,但这不是唯一的,这只是一个重复的客户编号,因此与上述内容无关。谢谢mathguy。我的数据集存在的问题是没有序列号来识别哪个事件主持另一个事件,因此时间戳重复。我的数据集中有唯一的客户号,因此我没有将其包括在样本数据集中,因为我认为这不会产生任何差异。关于上述内容,我是否需要添加标志列?谢谢,顺便说一句……不,您不需要添加
标志
列。由解决方案中的子查询添加,并完全由外部查询使用。您不需要在输入或输出中使用它!我对重复时间戳的观察是这样的:在重复时间戳时,工作发生了什么,是由a部门同时给B部门,还是由B部门同时给a部门?重复的时间戳还意味着什么?mathguy,谢谢你的回复。结果是,我的同事创建了一个新表,并选择了他需要的列,其中一个主要列有一个序列号,给出了作业的顺序,但他没有实现。不幸的是,他正在休假,我无法进入主桌,因此我试图用我所拥有的来解决这个问题。从表中,作业已从A部门传递到B部门,但由于时间戳,很难理解订单。
select MAIN_DEPT, count(flag) - 1 as ct
from   ( select P_DATE, MAIN_DEPT, 
                case when MAIN_DEPT = lag(MAIN_DEPT) over (order by P_DATE)
                     then null else 0 end   as flag
         from   TEST_COUNT
       )
where flag is not null   --  optional, but it may speed up the query (to be tested!)
group by MAIN_DEPT
having count(flag) > 1
order by MAIN_DEPT   --   ORDER BY is optional
;


MAIN_DEPT      CT
--------- -------
Dept A          2
Dept B          2