我有一个具有以下架构的表:
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 |
答案 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;