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

标签 sql oracle11g row-number dense-rank

我遇到了一个看起来很简单的解决方法的障碍,但我似乎无法找到解决方案。我希望这里的一些对 Oracle SQL 有更多了解的人可以提供帮助。

基本上,我正在构建一个按完成日期排序的工作列表,这很简单。它们之间的共同联系是它们都针对同一客户(不同编号)和相同位置(不同编号)。我的问题是,每当两个作业之间的持续时间超过 30 天时,我都需要找到一种方法来中断并从 1 重新开始排名/计数。这是我正在查看的内容的简化版本:

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 天的时间范围,链条应该从下一份工作开始。我的问题是我无法找到一种方法来划分数据,以便识别此标准并重新开始计数。没有其他列允许我以这种方式划分 row_number 或 dense_rank(例如,每个 30 天链的公共(public)订单键或系统作业序列)。

我已经尝试了大约 20 种不同的方法来解析我在此处阅读的线程中的这些数据,但都无济于事,因此,对于如何实现这一点的任何帮助或想法,我们将不胜感激。我有大约 50,000 行数据需要应用此排序。我已经在工作中和工作中自学了大约一年的 SQL。我已经达到了这方面的知识极限。

最佳答案

基本上,您需要一个额外的分组。您可以通过对差值大于 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 开始,我不完全理解这一点。

关于sql - 满足条件时重新启动 Row_Number 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35188963/

相关文章:

mysql - SQL语句插入重复数据

mysql - MariaDB 循环不显示查询结果

mysql - SQL ROW_NUMBER 给出错误

mysql - mysql 中的 ROW_NUMBER() 等效函数

sql - 如何将负值放入括号中

windows - 如何在 Windows 中为 Oracle DB 源 sql 文件

c# - 从 C# 控制台应用程序将大约一百万条记录插入 Oracle 的有效方法是什么?

sql - PLSQL 从字符串中获取值

sql - 手动指定 Row_Number() 的起始值

sql - LINQ 订单依据。它总是返回相同的有序列表吗?