【问题标题】:SQL AVG over subset of rows行子集上的 SQL AVG
【发布时间】:2014-12-24 02:33:48
【问题描述】:

我在尝试在频繁运行的查询中计算的平均值时遇到问题。这个小提琴应该显示我到目前为止所拥有的:

http://sqlfiddle.com/#!3/6afa9/4

理想情况下,我希望将平均计算限制为仅 4 个最近提交的报告。所以预期的结果应该是

+----+---------+
| id | runtime |
+----+---------+
|  1 |     600 |
|  2 |     660 |
+----+---------+

我尝试了OVER PARTITION,但似乎找不到与我想要的东西接近的东西。

【问题讨论】:

    标签: sql sql-server-2008 aggregate-functions


    【解决方案1】:

    您可以将 ROW_NUMBER() 嵌入到 CTE 中,以按完成日期获取最近的 4 次运行。

    ;WITH cte AS (
      SELECT
        id,
        DATEDIFF(minute, started, finished) AS runtime,
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY finished DESC) AS RowNum
      FROM report
    )
      SELECT
        id,
        AVG(runtime) AS AvgRuntime
      FROM cte
      WHERE RowNum <= 4
      GROUP BY id
    

    产生这些结果

    | ID | AVGRUNTIME |
    |----|------------|
    |  1 |        600 |
    |  2 |        660 |
    

    链接到 SQL Fiddle:http://sqlfiddle.com/#!3/6afa9/8/0

    【讨论】:

    • 感谢您的编辑 :) 当我发布第一个答案时,SQL Fiddle 已关闭,一旦恢复,我无法进行足够快的编辑。
    • 嘿!谢谢你看看这个。当您说顺序ID时,您是指在报告表中按顺序分配还是按顺序排列?它们在报告表中没有按顺序排序(我会更新小提琴以尝试显示这一点,但看起来他们又遇到了一些麻烦。)我认为这不重要,但我认为 ORDER BY 在线5 应该被提交没完成?
    • 当我这么说时,我的假设是错误的,因为 SQL Fiddle 已关闭,我无法看到您的数据的真实情况。现在的答案并不关心该假设,而是按完成的列对其进行排序,因此无关紧要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2021-03-19
    • 2010-10-30
    相关资源
    最近更新 更多