【发布时间】:2016-06-17 09:49:32
【问题描述】:
我在 SQL Server 中有一个 FormSummaries 表,其中包含以下相关的示例数据列:
FormName | CompletionTime
Form1 | 70
Form1 | 20
Form1 | 30
Form1 | 40
Form1 | 80
Form1 | 60
Form1 | 90
Form1 | 10
Form2 | 30
Form2 | 40
Form2 | 80
Form2 | 90
Form2 | 40
Form2 | 1000
Form2 | 120
Form2 | 70
我需要做的是:
1) 按表单名称和该表单的平均完成时间对数据进行分组,非常简单:
SELECT
FormName, AVG(CompletionTime)
FROM
FormSummaries
WHERE
CompletionTime is not null
GROUP BY
FormName
2) 获取每种表单类型前 25%/后 25% 的完成时间的平均值(即完成每个表单所需的平均最快和最慢 25% 的时间)。理想情况下,这将在一个查询中,即
FormName | Bottom25%AverageCompletionTime | Top25%AverageCompletionTime
Form1 | 85 | 15
Form2 | 560 | 35
我生活在现实世界中,并意识到这可能是不可能的,所以单独查询顶部和底部就可以了,即
FormName | Bottom25%AverageCompletionTime
Form1 | 85
Form2 | 560
FormName | Top25%AverageCompletionTime
Form1 | 15
Form2 | 35
我查看了 Partition by、Ntile 和 Over,但我似乎无法获得任何东西来产生所需的结果(尽管这很可能是因为我没有正确实现这些!)。
有人可以帮忙吗?
非常感谢。
【问题讨论】:
-
在您的第一个查询中,您不需要 'WHERE CompletionTime is not null' ,因为 AVG 将忽略空值
标签: sql sql-server group-by average