行子集上的 SQL AVG

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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 已关闭,我无法看到您的数据的真实情况。现在的答案并不关心该假设,而是按完成的列对其进行排序,因此无关紧要。

以上是关于行子集上的 SQL AVG的主要内容,如果未能解决你的问题,请参考以下文章

对 Oracle DB 中表上的行子集强制唯一性

使用动态编程从 Python 上的子集总和问题中获取所有子集

复制经过过滤的数据子集:合并复制还是事务复制?

sql子集查询

除了加载行子集之外,使用 NSFetchedResultsController 有啥好处

sql 怎么根据父id查询下三级子集