当条件满足时重新启动Row_Number序列

3
我遇到了一个看似简单的问题,但我无法找到解决方案。希望在这里有更多Oracle SQL知识的人能够帮助我。
本质上,我正在建立一个按完成日期排名的作业列表,这很简单。它们之间的共同链接是它们都是为同一客户(不同编号)和在同一位置(不同编号)执行的。我的问题是,我需要找到一种方法来在两个作业之间的持续时间超过30天时中断并重新开始该排名/计数。以下是我正在研究的简化版本:
JOBCOUNT  ACCTNUM   LOCNUM      COMPDATE           DURATION  
--------  -------   ------      --------           -------- 
  2        001       003      8/21/2015 16:47     15.48763889        
  3        001       003      10/5/2015 11:31     41.98304398        
  4        001       003      10/19/2015 9:59     13.21804398        
  5        001       003      11/13/2015 15:23    24.43752315         
  6        001       003      11/30/2015 19:19    11.35537037        

按照我希望的方式,由于第二行超过30个字,应该这样处理:

JOBCOUNT  ACCTNUM   LOCNUM      COMPDATE           DURATION  
--------  -------   ------      --------           -------- 
  2        001       003      8/21/2015 16:47     15.48763889        
  1        001       003      10/5/2015 11:31     41.98304398        
  2        001       003      10/19/2015 9:59     13.21804398        
  3        001       003      11/13/2015 15:23    24.43752315         
  4        001       003      11/30/2015 19:19    11.35537037 

由于第二个工作超出了30天的时间范围,因此下一个工作应该从一开始重新计数。我的问题是,我找不到一种方法来分区数据,以便识别这个标准并重新开始计数。没有另一列可以让我以这种方式分区行号或密集等级(例如,常见的排序键或每个30天链的系统作业顺序)。
我已经尝试了大约20种不同的方法来解析这些数据,但都没有成功,所以任何帮助或关于如何实现这一点的想法将非常感激。我有大约50,000行数据需要应用这种排序。我已经在工作中自学SQL约一年了,这个问题已经超出了我的知识限制。

你为什么要从2开始而不是1? - Gordon Linoff
1个回答

2

基本上,您需要一个额外的分组。您可以通过对差异大于30的标志进行累加来计算分组。然后其余部分似乎是 row_number()

select t.*,
       row_number() over (partition by acctnum, locnum, grp order by compdate) as jobcount  
from (select t.*,
             sum(case when duration > 30 then 1 else 0 end) over
                 (partition by acctnum, locnum order by compdate) as grp
      from t
     ) t;

然而,您的样本数据从2开始而不是1,这一点我并不完全理解。


谢谢,我会实现并更新。样本以2开头,因为原始作业由于不需要在输出中分发而在查询中被排除(我将一些列连接到我的原始数据提取的末尾,以添加以前的作业信息供参考,因此第一个作业将是冗余的)。如果需要,它可以在后续过程中重新包含和排除。 - Danny P.
太棒了,非常感谢你,Gordon。 - Danny P.
1
多年后,仍然给了我很大的帮助。谢谢。 - Jon Ekiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接