【问题标题】:Select Average of Top 25% of Values in SQL选择 SQL 中前 25% 值的平均值
【发布时间】:2013-12-02 18:40:05
【问题描述】:

我目前正在为我的客户编写一个存储过程来填充一些稍后将用于生成 SSRS 报告的表。一些数据基于基于每个客户的季度数据(由客户发送给他们)运行的特定股票公式。数据的另一部分是通过将这些结果与其他类似规模的客户的结果进行比较而生成的。他们希望在报告中跟踪的内容之一是该特定比较组前 25% 的公式结果的平均值。

为了更好地了解它,想象一下我在临时表中的以下字段:

FormulaID int
Value decimal (18,6)

我想做以下事情:给定一个特定的FormulaID 返回Value 的前 25% 的平均值。

我知道如何在 SQL 中取平均值,但我不知道如何仅针对特定群体的前 25% 进行取平均值。

我将如何编写这个查询?

【问题讨论】:

    标签: sql sql-server tsql stored-procedures


    【解决方案1】:

    我猜你可以做这样的事情......

    SELECT AVG(Q.ColA) Avg25Prec
    FROM (
          SELECT TOP 25 Percent ColA
          FROM Table_Name
          ORDER BY SomeCOlumn
         ) Q
    

    【讨论】:

    • 我从未听说过percent 关键字。有趣(和+1)。不过,我认为您的意思是 order by SomeColumn desc。否则不会抢到最底层的 25% 吗?
    • 关键词百分比是在 sql server 2005 中引入的你想要的。
    【解决方案2】:

    根据上面显示的表格,这就是我所做的:

    select AVG(t.Value)
    from (select top 25 percent Value
          from @TempGroupTable
          where FormulaID = @PassedInFormulaID
          order by Value desc) as t
    

    desc 必须在那里,因为percent 命令实际上不会进行比较。它只会简单地抓取前 x 条记录,其中 x 等于它正在查询的记录数的 25%。因此,order by Value desc 行将获取前 25% 的最高 Value 记录,然后发送该信息进行平均。

    作为所有这一切的旁注,这也意味着如果您想获得 底部 25%,或者如果您的公式结果就像高尔夫分数(即最低就是最好),您需要做的就是删除 desc 部分,然后您就可以开始了。

    【讨论】:

    • 正是我所说的,您必须决定要在 order by 子句中使用哪一列,当然还有顺序,以决定哪些行被视为 TOP Rows :)
    • 我喜欢一些懦夫投反对票并且不留下说明原因。因为这确实有助于 SO 社区。​​span>
    猜你喜欢
    • 2016-09-04
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2013-10-30
    • 2012-11-16
    相关资源
    最近更新 更多