跨记录组的时间间隔计算

Posted

技术标签:

【中文标题】跨记录组的时间间隔计算【英文标题】:Time intervals calculations across record groups 【发布时间】:2020-11-10 02:05:27 【问题描述】:

我们的机器正在运行并创建开始和停止时间的运行日志,这些日志会渗入连续的报告中。每次运行包含 10 个时间戳(5 个开始和 5 个停止)。麻烦的是,第 (n-1) 次运行以开始日期结束(例如 Run_2 的第 11 行),而我需要的停止日期是第 n 次运行的一部分(Run_3 的第 10 行)。我需要将开始时间和停止时间分成不同的列。

源表的结构是这样的。

Name ROW RUN    DATE_TS (this is a timestamp sorted desc)

A    1  Run_3   START1  
A    2  Run_3   STOP1  
A    3  Run_3   START2
A    4  Run_3   STOP2
A    5  Run_3   START3
A    6  Run_3   STOP3
A    7  Run_3   START4
A    8  Run_3   STOP4
A    9  Run_3   START5
A    10 Run_3   STOP5
A    11 Run_2   START1
A    12 Run_2   STOP1
A    13 Run_2   START2
A    14 Run_2   STOP2
A    15 Run_2   START3
A    16 Run_2   STOP3
A    17 Run_2   START4
A    18 Run_2   STOP4
A    19 Run_2   START5
A    20 Run_2   STOP5
A    21 Run_1   START1
A    22 Run_1   STOP1
A    23 Run_1   START2
A    24 Run_1   STOP2
A    25 Run_1   START3
A    26 Run_1   STOP3
A    27 Run_1   START4
A    28 Run_1   STOP4
A    29 Run_1   START5
A    30 Run_1   STOP5  

Target(start和stop表示来自源表的日期对应的rowid)

Name    Start   Stop (replace row_id's with Actual timestamps)
A          3    2
           5    4
           7    6
           9    8
           11   10
           13   12
           15   14
           17   16
           19   18
           21   20
           23   22
           25   24
           27   26
           29   28

非常感谢任何指导!提前谢谢你。

【问题讨论】:

您如何识别这些运行、启动和停止?实际数据会有所帮助。 【参考方案1】:

这回答了最初的问题。

使用可以使用lag():

select t.*
from (select name, row as start,
             lag(row) over (partition by name order by row) as stop
      from t
     ) t
where name like 'START%';

就像您问题中的数据一样,这假设数据是完美交错的——所以这是最简单(或最简单的)解决方案。如果您的数据实际上更复杂,那么我建议您使用更好的样本数据提出另一个问题。

【讨论】:

非常感谢戈登。一些澄清 - 源 date_ts 是包含时间戳值的列。我输入了文本以突出显示计算。此外,目标列 Start 和 Stop 是与输入的 row_id 对应的时间戳值。我试图尽可能清楚。鉴于此,您的 SQL 将如何变化? @user1760691 。 . .最好提出一个新问题,而不是使这个答案无效。 抱歉,我不太明白。我将如何以不同的方式陈述这个问题?我不经常在这里发帖。 @user1760691 。 . .我回答了你最初提出的问题。你意识到你有一个不同的问题。这是一个常见的现象。当一个问题有一个或多个答案时,通常最好只问一个新问题。提出问题的目的不是要就“我真正的问题是什么”展开对话。就是回答实际提出的问题。

以上是关于跨记录组的时间间隔计算的主要内容,如果未能解决你的问题,请参考以下文章

c# 记录两个时间间隔

如何计算给定间隔内的记录?

计算由时间间隔分隔的连续每小时记录块的平均值

vb.net时间间隔的计算

Oracle中的时间间隔型数据掌握方法

在代码中用YYYY-MM-DD要注意了!