【问题标题】:How to Count Repeating Work For Each Department如何计算每个部门的重复工作
【发布时间】:2016-10-24 19:52:08
【问题描述】:

我目前正在尝试计算如何计算已发送到某个部门的工作,然后再分配给另一个部门。

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

如果它从 A 部门转到 B 部门,情况也是一样的,因为在这种情况下,我们将有 2 个部门来回进行计件工作。

逻辑不是基于工作最初从哪里开始的,它更多地是关于计算工作回到之前在链中的部门的值,只要它已经到了不同的部门之间的部门。例如,基于时间值,我可能会遇到这样一种情况,即该工作已在 A 部门进行了几次,因此计数将保持为 0。仅当它去了其他地方然后返回到原部门。

如果有人可以建议我如何编写此查询,因为目前我可以为每个部门写一个计数,但如果工作之前已经在该部门工作,那么它就是位。

以下是我的创建和插入语句。也只是为了澄清这是在 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_ID),其中每个工作都有一个标识号,然后当一个工作从一个部门传递到另一个部门时,它会保持相同的 ID。
  • 感谢 Ambulare 的回复。目前我所拥有的只是主要工作 ID,但这不是唯一的,这只是一个客户编号,对上述所有内容都重复,因此不相关。

标签: sql oracle count


【解决方案1】:

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

每当MAIN_DEPT 更改(包括第一行)时,该解决方案通过将标志 0(或不是null 的任何东西,真的!)添加到一行,否则添加null。然后外部查询按MAIN_DEPT(和job_id,如果存在)分组,对标志进行计数(仅表示非空值),它只选择计数为2或更多的组,并从计数中减去1因为那是你的要求。这是 start-of-group 技术(我在此解决方案中使用的技术的名称)的直接应用。

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

【讨论】:

  • 谢谢 mathguy。我的数据集的问题是没有序列号来识别哪个事件主持另一个事件因此重复的时间戳。我在我的数据集中拥有的是唯一的客户编号,因此我没有包含在我的示例数据集中,因为我不认为它会有所作为。关于上述内容,我是否需要添加一个标志列?谢谢顺便说一句...
  • 不,您不需要添加flag 列。这是由解决方案中的子查询添加的,并由外部查询完全使用。您在输入或输出中不需要它!我对重复时间戳的观察是这样的:重复时间戳的工作发生了什么,它是由部门 A 给部门 B 以及由部门 B 给部门 A 同时给出的吗?重复的时间戳还有什么意义?
  • mathguy,感谢您的回复。发生的事情是我的同事创建了一个新表并挑选了他需要的列,其中一个主要的有一个序列号,它给出了工作的顺序,但他没有带来这个。不幸的是,他正在休假,我无法进入主桌,因此我试图用我所拥有的来解决这个问题。从表中可以看出,工作已从 A 部门传递到 B 部门,但由于时间戳的关系,因此难以理解顺序。
猜你喜欢
  • 2015-04-28
  • 1970-01-01
  • 2019-06-23
  • 2021-01-31
  • 2012-01-10
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
相关资源
最近更新 更多