【问题标题】:mySQL: Finding average after removing top and bottom nth% of datamySQL:删除顶部和底部第 n% 的数据后求平均值
【发布时间】:2017-06-02 18:35:16
【问题描述】:

我有一个包含 3 列的表:list_num、sales_price 和 days_on_market

我想运行一个查询,该查询将为列“days_on_market”的平均值输出一个数字,并在按“sales_price”排序时删除前 5% 和后 5% 的行。

我找到了一个我认为在这里会有所帮助的示例,但答案太复杂了,我无法理解(我上周刚开始学习 mySQL)。请参阅此示例here

这是我的代码:

SELECT round(avg(days_on_market),0) as "90% Sell In"
FROM sold_q3_2016
WHERE list_num NOT IN (
    SELECT list_num FROM sold_q3_2016 ORDER BY sales_price LIMIT (count(list_num)*0.05)
    ) OR list_num NOT IN (
    SELECT list_num FROM sold_q3_2016 ORDER BY sales_price desc LIMIT (count(list_num)*0.05)
    )
;

现在我什至无法运行它,因为我在 LIMIT 子句内的 count 函数周围遇到语法错误,但我想把它留在这里以展示我的思考过程。有什么想法吗?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    试试这个:

    SELECT AVG(days_on_market) 
    FROM (
        SELECT 
        l.*
        , @rownumber := @rownumber + 1 AS rownumber
        FROM list_num l
        , (SELECT @rownumber := 0) var_init_subquery
        ORDER BY sales_price DESC
    ) subquery_alias
    WHERE rownumber >= @rownumber * 0.05
    AND rownumber <= @rownumber * 0.95
    

    【讨论】:

    • 很好,我正在使用LIMIT 研究另一种方法,但这似乎不接受使用变量...这意味着转换为准备好的语句(由于明显的错误,请参阅stackoverflow.com/questions/245180/… )。
    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2017-12-08
    相关资源
    最近更新 更多