2012-01-18 57 views
2

我一直在试图编写一个查询,该查询返回数据库中不同行之间的平均时间差。基本上,这与基于数字存储记录的表格有关。确定列是RSP_TRM_IRN,并且针对RSP_TRM_IRN中的不同值存储每个后续条目的时间戳。下面的示例表格显示了数据的结构。现在我希望它根据RSP_TRM_IRN中的唯一值返回表中每个条目的平均时间差。模式也在下面。数据库中行之间的日期时间差异

模式:

"RSP_IRN" type="bigint" width="8" 
"RSP_DATETIME" type="timestamp" width="8" 
"RSP_TRM_IRN" type="bigint" width="8" 

样本数据,以证实它是如何分布的:

RSP_TRM_IRN  RSP_DATETIME 
93  2011-11-09 13:18:32 
101 2011-11-03 11:49:10 
7  2011-11-08 02:32:28 
101 2011-11-14 16:48:43 
108 2011-11-17 09:00:49 
5  2011-10-12 09:30:28 
213 2011-11-17 13:47:23 
108 2011-11-17 07:18:15 
7  2011-11-07 06:43:49 
159 2011-11-21 06:49:25 
5  2011-11-16 07:10:58 
104 2011-11-03 15:17:39 
108 2011-11-15 23:34:58 
5  2011-11-22 09:38:02 
108 2011-11-13 13:28:32 
7  2011-10-26 00:07:26 
100 2011-11-14 14:27:02 
5  2011-11-14 21:56:05 
7  2011-10-25 12:11:17 
145 2011-11-21 15:26:17 
5  2011-10-10 11:23:53 

请帮助任何人。尝试使用PHP的这一点,但将不得不周围循环,这可能会使逻辑更复杂。我试图使用上面的数据来实现的是获得RSP_TRM_IRN = 5的时间之间的平均时间差。

+0

假设这是MySQL的? – Yuck 2012-01-18 17:14:40

+0

@ Stun101:您的示例数据看起来不符合您的表格结构。 – 2012-01-18 17:17:04

+0

@MarkBannister看起来像它对我来说......列没有按照相同的顺序列出,并且不包括'RSP_IRN',否则它们匹配。 – Yuck 2012-01-18 17:18:55

回答

2

由于所有的周期都是连续的,所有你需要知道的是time of the first event,time of the last eventnumber of discrete periods

平均值是(完成 - 开始)/期间。根据您使用的SQL方言,(完成 - 开始)可以采用多种不同的形式(例如SQL Server中的DATEDIFF() ...)。

现在,这里是如何派生你需要的信息。

SELECT 
    RSP_TRM_IRN, 
    COUNT(*) - 1   AS periods, 
    MIN(RSP_DATETIME) AS start, 
    MAX(RSP_DATETIME) AS finish 
FROM 
    yourTable 
GROUP BY 
    RSP_TRM_IRN 

然后SQL Server会用...

DATEDIFF(SECOND, MIN(RSP_DATETIME), MAX(RSP_DATETIME))/(COUNT(*) - 1) AS Average_Period_Length