【问题标题】:Get MAX() minus MIN() for each GROUP BY column in SQL Server 2016?获取 SQL Server 2016 中每个 GROUP BY 列的 MAX() 减去 MIN()?
【发布时间】:2020-02-06 17:03:11
【问题描述】:

不知道如何措辞,但基本上,我想编写一个查询,为每个“LocationDescription”输出其 MAX(StatusDateTime) 减去其 MIN(StatusDateTime) 的结果,如果这甚至可能通过一个查询,天空中的饼图输出还将包括给定 LocationDescription 的总行数。

样本数据:

LocationDescription StatusDateTime
Site 1              2/6/20 10:35:34.027
Site 1              2/6/20 10:35:33.823
Site 1              2/6/20 10:35:33.183
Site 1              2/6/20 10:35:32.387
Site 2              2/6/20 10:35:53.500
Site 2              2/6/20 10:33:06.917
Site 2              2/6/20 10:33:06.300
Site 2              2/6/20 10:34:44.083
Site 2              2/6/20 10:34:52.410
Site 2              2/6/20 10:34:40.503
Site 2              2/6/20 10:34:49.710
Site 2              2/6/20 10:35:53.753
Site 3              2/6/20 10:32:38.253
Site 3              2/6/20 10:36:08.987
Site 3              2/6/20 10:36:08.013
Site 3              2/6/20 10:36:06.060
Site 3              2/6/20 10:32:45.890

理想输出(根据上面的示例数据,持续时间大致如下):

LocationDescription DurationDifference TotalRecords
Site 1              00:00:02.000       4
Site 2              00:02:47.000       8
Site 3              00:03:21.000       5

这可以通过 1 个查询实现吗?

编辑:我的最终目标是尝试说出“站点 1 每秒 X 条记录”、“站点 2 每秒 X 条记录”等。这是我计划的基于性能的指标在仪表板上使用,以显示运行状况检查的速度。

【问题讨论】:

  • 您是否需要这种格式的持续时间差异,或者您是否也接受以某个固定时间单位报告差异,例如秒?
  • 秒实际上是完美的! (我添加了一些额外的信息,可能会使那部分更清晰)

标签: sql-server sql-server-2016


【解决方案1】:

尝试按位置描述进行聚合,然后在几秒钟内使用DATEDIFF 找出最小和最大状态时间之间的差异。

SELECT
    LocationDescription,
    DATEDIFF(second, MAX(StatusDateTime), MIN(StatusDateTime)) AS DurationDifference,
    COUNT(*) AS TotalRecords
FROM yourTable
GROUP BY
    LocationDescription;

【讨论】:

  • 真是个了不起的人!甚至没有想过在 DATEDIFF 中使用“第二个”的东西。效果很好!
  • 跟进:我正在尝试为“每秒”计算部分添加一列。我无法发布修改后的查询,因为它对于评论框来说太长了,但只是试图将总记录除以 durationdifference 以获得“每秒记录数”列的十进制/整数值。虽然得到所有 0 个输出。
  • 使用:1.0 * COUNT(*) / DATEDIFF(second, MAX(StatusDateTime), MIN(StatusDateTime)) ... 你需要告诉 SQL Server 进行浮点除法而不是整数除法。
【解决方案2】:

这符合您的要求。

SELECT 
  LocationDescription,
  DATEDIFF(seconds,MAX(StatusDateTime), MIN(StatusDateTime)) AS DurationDifference,
  COUNT(*) AS TotalRecords
FROM MyTable
GROUP BY LocationDescription

【讨论】:

  • 看到这个答案,我有一种似曾相识的强烈感觉。
  • 我也是!我打了帖子,有你的版本在等我。因为我错过了分号,所以我投票支持你。
猜你喜欢
  • 1970-01-01
  • 2018-10-26
  • 2020-07-23
  • 2014-05-06
  • 2019-10-09
  • 2013-04-06
  • 2013-02-16
  • 1970-01-01
  • 2015-12-10
相关资源
最近更新 更多