【问题标题】:Calculate time span over a number of records计算多条记录的时间跨度
【发布时间】:2018-10-01 08:12:29
【问题描述】:

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

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 记录和最新记录之间的时间跨度?本质上,我想看看网络服务读取和写入的记录速率。

甚至可以在单个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  |

【问题讨论】:

  • 这里不需要做SELECT DISTINCT,GROUP BY不返回重复项。
  • max(CaptureDateTime) - min(CaptureDateTime)?

标签: sql sql-server datetime group-by


【解决方案1】:

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

SELECT
    TransmissionID,
    COUNT(*),
    DATEDIFF(second, MIN(CaptureDateTime), MAX(CaptureDateTime))
FROM yourdata
GROUP BY TransmissionID
HAVING COUNT(*) > 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

【讨论】:

    【解决方案3】:

    返回所有transmissionids的平均时间的方法,即使只有1条记录:

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

    请注意,您实际上可能并不想要 given 传输 ID 的最大捕获日期。您可能需要表格中的总体最大值 - 因此您可以考虑最近记录之后的最后一个时期。

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

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

    【讨论】:

    • 感谢 Gordon 的这些建议,我会看看如何将它们应用到这个应用程序中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2012-12-09
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多