计算多个记录的时间跨度

时间:2018-10-01 08:12:29

标签: sql sql-server datetime group-by

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

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

有超过70,000条记录,它们将传输日志存储到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的第一条记录和最后一条记录之间的差异,我想得到一个像这样的结果集:

TransmissionID | TimeToCompletion | Number of records |
ABCDEF         |            2.001 |             5000  |

3 个答案:

答案 0 :(得分:3)

只需GROUP BY并使用MIN / MAX函数查找每个组中的最小/最大日期并减去它们:

SELECT
    TransmissionID,
    COUNT(*),
    DATEDIFF(second, MIN(CaptureDateTime), MAX(CaptureDateTime))
FROM yourdata
GROUP BY TransmissionID
HAVING COUNT(*) > 1

答案 1 :(得分:2)

使用最小和最大来计算时间跨度

SELECT [TransmissionID],
        COUNT(*) as 'Number of records',datediff(s,min(CaptureDateTime),max(CaptureDateTime)) as timespan
  FROM [log_table]
  GROUP BY [TransmissionID]
  HAVING COUNT(*) > 1

答案 2 :(得分:1)

一种返回 all transmissionids平均时间的方法,即使只有一条记录的时间也是如此:

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

请注意,您实际上可能并不需要给定的transmissionId的最大捕获日期。您可能需要表中的整体最大值-这样您可以考虑最近记录之后的最后一个时期。

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

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