满足条件时重新启动 Row_Number 序列
Restart Row_Number sequence when condition met
我 运行 遇到了障碍,这似乎是一个简单的解决方法,但我似乎无法找到解决方案。我希望这里的一些对 Oracle SQL 有更多了解的人可以提供帮助。
本质上,我正在构建一个按完成日期排序的工作列表,这很简单。它们之间的共同点 link 是它们都是针对同一个客户(不同的号码)和相同的位置(不同的号码)。我的问题是,每当两个作业之间的持续时间超过 30 天时,我需要找到一种方法来中断 rank/count 并从 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 天 window,链条应该从下一份工作开始。我的问题是我无法找到一种方法来划分数据,以便识别此标准并重新开始计数。没有其他专栏允许我以这种方式划分 row_number 或 dense_rank(例如,每个 30 天链的公共订单键或系统作业序列)。
我已经尝试了大约 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 开始的,我不太理解。
我 运行 遇到了障碍,这似乎是一个简单的解决方法,但我似乎无法找到解决方案。我希望这里的一些对 Oracle SQL 有更多了解的人可以提供帮助。
本质上,我正在构建一个按完成日期排序的工作列表,这很简单。它们之间的共同点 link 是它们都是针对同一个客户(不同的号码)和相同的位置(不同的号码)。我的问题是,每当两个作业之间的持续时间超过 30 天时,我需要找到一种方法来中断 rank/count 并从 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 天 window,链条应该从下一份工作开始。我的问题是我无法找到一种方法来划分数据,以便识别此标准并重新开始计数。没有其他专栏允许我以这种方式划分 row_number 或 dense_rank(例如,每个 30 天链的公共订单键或系统作业序列)。
我已经尝试了大约 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 开始的,我不太理解。