我想知道是否有可能在 SQL 中找到一行时间戳之间的平均值。我在互联网上找到了一些解决方案。但就我而言,我不想包括超过 4 小时的差异。是否可以在 MSQL 中执行此操作?因此,例如以下时间戳:
12-12-12 18:00:00
12-12-12 17:50:00
12-12-12 17:30:00
12-12-12 11:00:00
平均为:(20+10)/2=15
这可能吗?
提前致谢!
这个想法是在任何行上找到小于给定时间戳的最大时间戳。最兼容 SQL 的方式是使用相关子查询,它适用于任何数据库。
但是,时间戳在数据库之间通常不兼容,取差和比较常量的功能也不是标准的。这是 MySQL 中的一种方法,它将所有内容转换为算术的秒数:
select avg(TIME_TO_SEC(TIMEDIFF(TimeStamp, prevTimeStamp))
from (select t.*,
(select max(t2.timestamp) from t t2 where t2.timestamp < t.timestamp) as prevTimeStamp
from t
) t
where TIME_TO_SEC(TIMEDIFF(TimeStamp, prevTimeStamp) < 4*60*60
子查询应该在任何数据库中工作。数据库之间的时间函数不同。
你对信息有点害羞。也许您可以发布您现有的查询,以便我们获得更好的视角?
我假设您指的是 Microsoft SQL。我还希望您有其他标识符来关联时间戳,因此我将让您确定如何限制您的结果集。
我最初的建议是使用嵌套查询:
--Sample Table
declare @TimeTable table ( RowId int Identity, Stamp datetime)
insert into @TimeTable select '12/1/2012 04:00'
insert into @TimeTable select '12/1/2012 04:30'
insert into @TimeTable select '12/1/2012 05:00'
--Test Query - Find the next record
select Stamp,
(
select top 1 Stamp
from @TimeTable t2
where RowId > T1.RowId
) as CompareDate
from @TimeTable T1
--Test Query - Instead of dates, show difference in minutes
select
datediff(n,
Stamp,
(
select top 1 Stamp
from @TimeTable t2
where RowId > T1.RowId
)
) as Mins
from @TimeTable T1
--Finally we average the result of minutes
select avg(AverageTable.Mins)
from
(
select
datediff(n,
Stamp,
(
select top 1 Stamp
from @TimeTable t2
where RowId > T1.RowId
)
) as Mins
from @TimeTable T1
) as AverageTable
想象一下你有
12-12-12 18:00:00
12-12-12 17:50:00
12-12-12 17:30:00
12-12-12 11:00:00
12-12-12 10:50:00
12-12-12 10:30:00
并且您不想包含超过 4 小时的差异。你会拒绝哪些时间戳?嗯...您可以建立总平均值,包括所有时间戳。然后你可以计算它的变化并拒绝某些outliers
。查看上面的行时,异常值会是什么?您必须拒绝整个morning cluster
或整个evening cluster
. 但是,我敢肯定这两个都不是你想要的。因此,您应该将rejection criteria
> 4 小时视为坏事,并为您想要的东西找到更有意义的东西。