代码之家  ›  专栏  ›  技术社区  ›  Daniel

计算多个记录的时间跨度

  •  0
  • Daniel  · 技术社区  · 7 年前

    我有一个具有以下架构的表:

    ID | FirstName | Surname | TransmissionID | CaptureDateTime
    1  | Billy     | Goat    | ABCDEF         | 2018-09-20 13:45:01.098
    2  | Jonny     | Cash    | ABCDEF         | 2018-09-20 13:45.01.108
    3  | Sally     | Sue     | ABCDEF         | 2018-09-20 13:45:01.298
    4  | Jermaine  | Cole    | PQRSTU         | 2018-09-20 13:45:01.398
    5  | Mike      | Smith   | PQRSTU         | 2018-09-20 13:45:01.498
    

    有超过70000条记录,它们将传输日志存储到一个web服务中。我想知道的是,我将如何着手编写一个脚本来选择不同的 TransmissionID 值,还显示最早 CaptureDateTime 唱片和最新唱片?基本上我想看看web服务读取记录的速率;写作。

    有没有可能一次就做到 SELECT SELECT DISTINCT TransmissionID

    这是我到目前为止得到的(我被时间计算困住了)

    SELECT DISTINCT [TransmissionID],
            COUNT(*) as 'Number of records'
      FROM [log_table]
      GROUP BY [TransmissionID]
      HAVING COUNT(*) > 1
    

    不知道如何得到第一个和最后一个记录之间的差异相同

    TransmissionID | TimeToCompletion | Number of records |
    ABCDEF         |            2.001 |             5000  |
    
    3 回复  |  直到 7 年前
        1
  •  3
  •   Salman Arshad    7 年前

    简单 GROUP BY 使用 MIN / MAX

    SELECT
        TransmissionID,
        COUNT(*),
        DATEDIFF(second, MIN(CaptureDateTime), MAX(CaptureDateTime))
    FROM yourdata
    GROUP BY TransmissionID
    HAVING COUNT(*) > 1
    
        2
  •  2
  •   Fahmi    7 年前

    使用“最小值”和“最大值”计算时间跨度

    SELECT [TransmissionID],
            COUNT(*) as 'Number of records',datediff(s,min(CaptureDateTime),max(CaptureDateTime)) as timespan
      FROM [log_table]
      GROUP BY [TransmissionID]
      HAVING COUNT(*) > 1
    
        3
  •  1
  •   Gordon Linoff    7 年前

    一种返回平均时间的方法 transmissionids ,即使只有一个记录:

    SELECT TransmissionID,
        COUNT(*),
        DATEDIFF(second, MIN(CaptureDateTime), MAX(CaptureDateTime)) * 1.0 / NULLIF(COUNT(*) - 1, 0)
    FROM yourdata
    GROUP BY TransmissionID;
    

    请注意,您实际上可能不希望捕获日期的最大值 鉴于

    如果是这样,这看起来像:

    SELECT TransmissionID,
        COUNT(*),
        DATEDIFF(second,
                 MIN(CaptureDateTime),
                 MAX(MAX(CaptureDateTime)) OVER ()
                ) * 1.0 / COUNT(*)
    FROM yourdata
    GROUP BY TransmissionID;