0

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

这可能吗?

提前致谢!

4

3 回答 3

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

子查询应该在任何数据库中工作。数据库之间的时间函数不同。

于 2012-12-30T14:54:08.250 回答
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
于 2012-12-30T12:32:02.410 回答
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 小时视为坏事,并为您想要的东西找到更有意义的东西。

于 2012-12-30T12:10:15.260 回答