【问题标题】:AVG time spent on multiple rows SQL-server?在多行 SQL 服务器上花费的 AVG 时间?
【发布时间】:2010-05-25 18:14:05
【问题描述】:

我在 MS SQL 中有一个包含 3 个列的表 tblSequence: ID、IP、[时间戳]

内容可能如下所示:

ID          IP              [Timestamp]
--------------------------------------------------
4347        62.107.95.103   2010-05-24 09:27:50.470
4346        62.107.95.103   2010-05-24 09:27:45.547
4345        62.107.95.103   2010-05-24 09:27:36.940
4344        62.107.95.103   2010-05-24 09:27:29.347
4343        62.107.95.103   2010-05-24 09:27:12.080

ID是唯一的,可以有n个IP。

想计算每个 IP 花费的平均时间。在一行中

知道你可以这样做:

SELECT CAST(AVG(CAST(MyTable.MyDateTimeFinish - 
         MyTable.MyDateTimeStart AS float)) AS datetime)

但是我到底如何找到我的唯一 IP 行的第一个和最后一个条目,以便我可以有一个开始和结束时间?我卡住了。

想计算每个 IP 花费的平均时间。在一行中

【问题讨论】:

    标签: sql-server tsql average


    【解决方案1】:

    但是我到底怎么才能找到第一个 以及我唯一 IP 行的最后一个条目,所以 我可以有开始和结束时间吗? 我卡住了。

    Select IP, MIN([Timestamp]) as MinTime,  Max([Timestamp]) as MaxTime
    from your table
    group by IP
    

    【讨论】:

    • 坏消息是这将看到相隔 3 天的 2 次访问并报告 72 小时。这是期望的行为吗?我假设他经过了某种会话长度,并且希望连续所有时间间隔不超过约 30 分钟。
    • 1.那么如何使用上面的函数编写整个 SQL 呢? 2. 想要包含一个 WHERE 子句 - 如何与 Group BY 结合使用?
    • 我有另一个具有唯一会话 ID 的列。 IP 仅用作使用 nvarchar 执行此操作的示例。
    【解决方案2】:

    假设您有一个可用于关联行的属性(列)(如 seesionID),那么

      Select s.SessionId, e.TimeStamp - s.Timestamp
      From tblSequence s
        Join tblSequence E
            On e.SessionId = s.Sessionid
                And e.TimeStamp = (Select Max(TimeStamp)
                                   From tblSequence 
                                   Where Sessionid = s.Sessionid)
      Where s.TimeStamp = (Select MinmeStamp)
                           From tblSequence 
                           Where Sessionid = s.Sessionid)
    

    使用评论中的 sql:修复 在第一行,e.TimeStamp - s.[SessionGuid]

    应该是 e.TimeStamp - s.[TimeStamp]

    在最后一个子查询中:

    MimeStamp)

    应该是

    分钟(时间戳)

    在下面编辑以处理每个 SessionGuid 只有一个(开始)行的情况...

     Select s.[SessionGuid], 
          Coalesce(e.TimeStamp], getdate()) - s.[TimeStamp
     From tblSequence s 
            Left Join tblSequence E 
               On e.[SessionGuid] = s.[SessionGuid] 
                  And e.TimeStamp = (Select Max(TimeStamp) 
                                     From tblSequence 
                                     Where [SessionGuid] = s.[SessionGuid]) 
        Where s.TimeStamp = (Select Min(TimeStamp) 
                             From tblSequence 
                             Where [SessionGuid] = s.[SessionGuid]) 
    

    【讨论】:

    • 可以有多行具有非唯一的 SessionGuid。现在这不会过滤掉重复项或使用分组依据。怎么办?
    • 这是我当前的 SQL:SELECT s.[SessionGuid], s.[siteID], e.[TimeStamp] - s.[TimeStamp] as TimeSpent FROM tblSequence s Join tblSequence E On e.[ SessionGuid] = s.[SessionGuid] And e.TimeStamp = (SELECT Max([TimeStamp]) FROM tblSequence WHERE [SessionGuid] = s.[SessionGuid]) WHERE s.TimeStamp = (SELECT Min([TimeStamp]) FROM tblSequence WHERE [SessionGuid] = s.[SessionGuid]) AND s.[siteID] = 15 ORDER BY s.[sessionGuid], TimeSpent
    • 因为 where 子句限制主查询生成时间戳不是每个 sessionGuid 的最早时间戳的行,这应该只为每个 sessionGuid 提供一行。是否有多行具有相同的 sessionGuid 和相同的时间戳???
    • 如果只有 1 行具有唯一的 SessionGuid,则会出现问题。然后看起来 max 和 min 例程返回的时间为零。
    • 那么这意味着只有一个“开始”时间而不是另一行来获取“结束”时间......那你想做什么?计算从开始到现在经过的时间?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多