Timestamp SQL与Limit之间的平均时间

时间:2012-12-30 11:34:17

标签: sql timestamp

我想知道是否有可能找到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

这可能吗?

提前致谢!

3 个答案:

答案 0 :(得分:0)

想象一下你有

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小时作为一个坏人,并找到更有意义的东西。

答案 1 :(得分:0)

你对信息有点害羞。也许您可以发布现有的查询,以便我们获得更好的视角?

我假设您指的是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

答案 2 :(得分:0)

我们的想法是在任何行上找到小于给定时间戳的最大时间戳。与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

子查询应该可以在任何数据库中使用。数据库之间的时间函数不同。