行子集上的 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的主要内容,如果未能解决你的问题,请参考以下文章
使用动态编程从 Python 上的子集总和问题中获取所有子集