【问题标题】:Average of Top n per Group SQL Server每个组 SQL Server 的前 n 个平均值
【发布时间】:2012-04-13 18:51:19
【问题描述】:

我正在解决查找平均处理时间的问题。我试图通过只对最好的 80% 数据进行平均来消除异常数据。

我正在努力调整现有的每组前 N 个解决方案以执行每组平均。使用 SQL Server 2008。

这是表格的示例:

    OpID  |  ProcessMin  |  Datestamp
    2     |  234         |  2012-01-26 09:07:29.000
    2     |  222         |  2012-01-26 10:04:22.000
    3     |  127         |  2012-01-26 11:09:51.000
    3     |  134         |  2012-01-26 05:02:11.000
    3     |  566         |  2012-01-26 05:27:31.000
    4     |  234         |  2012-01-26 04:08:41.000

我希望它为 每个 OpID 取 ProcessMin 的最低 80%,并取该数组的平均值。任何帮助将不胜感激!

* 更新 *

给定下表:

OpID  ProcessMin   Datestamp
602   33           46:54.0
602   36           38:59.0
602   37           18:45.0
602   39           22:01.0
602   41           36:43.0
602   42           33:00.0
602   49           03:48.0
602   51           22:08.0
602   69           39:15.0
602   105          59:56.0
603   13           34:07.0
603   18           07:17.0
603   31           57:07.0
603   39           01:52.0
603   39           01:02.0
603   40           40:10.0
603   46           22:56.0
603   47           11:03.0
603   48           40:13.0
603   56           25:01.0

我希望这个输出:

OptID   ProcessMin
602     41
603     34.125

请注意,由于每个 OpID 有 10 个数据点,它只会平均最低的 8 个值 (80%)。

【问题讨论】:

  • 这只是另一个子查询,用更多的样本数据向我们展示预期的结果。归根结底,它只是 opid 的一个组
  • @JonH -- 我添加了更多样本和输出作为上面的示例。我尝试做一个子查询,但我没有设置逻辑使得 Top 适用于每个 OpID 的 ProcessMin 集,而不是整个表。抱歉,这可能是一个新手错误。我认为这可能可以通过分区来完成,但我的尝试没有成功。

标签: sql-server-2008 group-by average top-n


【解决方案1】:

您可以使用ntile

select OpID,
       avg(ProcessMin) as ProcessMin
from
  (
    select OpID,
           ProcessMin,
           ntile(5) over(partition by OpID order by ProcessMin) as nt
    from YourTable
  ) as T
where nt <= 4
group by OpID

SE-Data

如果 ProcessMin 是 integer,您可以通过 avg(cast(ProcessMin as float)) as ProcessMin 获得十进制平均值。

【讨论】:

  • Mikael,看起来很完美,非常感谢!澄清一下,ntile(5) 本质上是将数据集划分为 5 个部分,而 nt 80%?
  • @EricHill - 是的,就是这样。
  • 非常感谢,您是救生员。我想我现在也终于明白 OVER PARTITION 是如何工作的了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2013-11-28
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
相关资源
最近更新 更多