在表中的非连续的行之间则DateDiff
-
19-09-2019 - |
题
我想借此从表1中的时间差的平均值。的值是不连续的,有时被重复的时间价值,所以我需要1)按时间排序,2)丢弃非唯一值,3)执行的时间差(毫秒),然后4)平均所得的时间差值。此外,我想5)限制DATEDIFF操作以选择的时间范围内,如 WHERE _TimeStamp> = '20091220 11:59:56.1' AND _TimeStamp <= _TimeStamp> = '20091220 11:59:56.8'。我很为难如何将所有这些组合起来!
表1:结果 _TimeStamp结果 2009-12-20 11:59:56.0点击 2009-12-20 11:59:56.5点击 2009-12-20 11:59:56.3点击 2009-12-20 11:59:56.4点击 2009-12-20 11:59:56.4点击 2009-12-20 11:59:56.9
解决方案
下面是一个工程和并不难看:
;WITH Time_CTE AS
(
SELECT
MIN(_Timestamp) AS dt,
ROW_NUMBER() OVER (ORDER BY MIN(_Timestamp)) AS RowNum
FROM Table1
GROUP BY _Timestamp
)
SELECT
t1.dt AS StartDate,
t2.dt AS EndDate,
DATEDIFF(MS, t1.dt, t2.dt) AS Elapsed
FROM Time_CTE t1
INNER JOIN Time_CTE t2
ON t2.RowNum = t1.RowNum + 1
会给你从你的例子下面的输出:
StartDate | EndDate | Elapsed
------------------------+-------------------------+--------
2009-12-20 11:59:56.000 | 2009-12-20 11:59:56.300 | 300
2009-12-20 11:59:56.300 | 2009-12-20 11:59:56.400 | 100
2009-12-20 11:59:56.400 | 2009-12-20 11:59:56.500 | 100
2009-12-20 11:59:56.500 | 2009-12-20 11:59:56.900 | 400
编辑:如果你要限制时间范围则WHERE _Timestamp BETWEEN @StartDate AND @EndDate
行之前刚刚添加GROUP BY
EDIT2:如果你想平均值,然后更改最终SELECT t1.dt, ...
语句:
SELECT AVG(DATEDIFF(MS, t1.dt, t2.dt))
FROM Time_CTE t1 ... (same as above)
其他提示
步骤1是只选择独特次:
SELECT DISTINCT _TimeStamp FROM table
WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8';
然后,如果你想,说,任何时候都互相比较(不知道你怎么想选择的时间),你可以做喜欢的事,疯狂的:
SELECT t1._TimeStamp, t2._TimeStamp, DATEDIFF(ms,t1._TimeStamp,t2._TimeStamp) FROM
(SELECT DISTINCT _TimeStamp FROM table
WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t1
INNER JOIN
(SELECT DISTINCT _TimeStamp FROM table
WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t2
WHERE t1._TimeStamp != t2._TimeStamp;
我的语法可能会关闭,因为我从MySQL来了,但类似的事情应该工作。
如果你想要的平均水平,你可以尝试采取上述结果的平均值:
SELECT AVG(DATEDIFF(ms,t1._TimeStamp,t2._TimeStamp)) FROM
(SELECT DISTINCT _TimeStamp FROM table
WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t1
INNER JOIN
(SELECT DISTINCT _TimeStamp FROM table
WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t2
WHERE t1._TimeStamp != t2._TimeStamp;
还未得到检验,但在理论上,我认为它应该工作。
如果我你想要什么样的假设是正确的,那么,我认为这样做有两种方式。
在直接的方法:
SELECT
AVG(DATEDIFF(ms, T1.my_time, T2.my_time))
FROM
My_Table T1
INNER JOIN My_Table T2 ON
T2.my_time > T1.my_time
WHERE
NOT EXISTS
(
SELECT
*
FROM
My_Table T3
WHERE
(T3.my_time > T1.my_time AND T3.my_time < T2.my_time) OR
(T3.my_time = T1.my_time AND T3.my_pk < T1.my_pk) OR
(T3.my_time = T2.my_time AND T3.my_pk < T2.my_pk)
)
棘手的方式:
SELECT
DATEDIFF(ms, MIN(my_time), MAX(my_time))/(COUNT(DISTINCT my_time) - 1)
FROM
My_Table
毕竟,平均差异仅仅是总差成你打破它下降分割数分配。
您将需要添加WHERE子句的日期范围内,如果你想通过限制,您将需要通过零在第二个查询占鸿沟的可能性。