【问题标题】:SQL calculating upper/lowerbound - which way is correct?SQL 计算上限/下限 - 哪种方式正确?
【发布时间】:2019-02-10 06:49:10
【问题描述】:

我对此很陌生,正在阅读一本关于数据分析的书,我一直在理解它如何计算订单值的上限和下限 - 我一定是回到这个页面而现在。

我一直在使用 excel,并认为我最好将其输入到 excel 中并尝试在那里理解它,将其分解成块,然后看看我可以从中推断出什么。

我已经设法在 Excel 中正确计算了它,但仍然难以完全掌握它(我没有接受过正式的数学培训!!)然后我意识到让我的头脑转起来有点复杂,也许我可以换一种方式。

以下代码的两个版本的结果相同(据我所知),但我的版本更易于阅读和理解。

谁能告诉我为什么这行不通?如果不正确?有什么原因吗?

书籍版本

SELECT lowerbound
    ,upperbound
    ,count(*) AS numorders
    ,min(val)
    ,max(val)
FROM (
    SELECT (floor(val / power(10.0, sign(numdigits) * (numdigits - 1))) * power(10.0, sign(numdigits) * (numdigits - 1))) AS lowerbound
        ,(floor(1 + (val / power(10.0, sign(numdigits) * (numdigits - 1)))) * power(10.0, sign(numdigits) * (numdigits - 1))) AS upperbound
        ,o.*
    FROM (
        SELECT (len(cast(floor(abs(totalprice)) AS INT)) * sign(floor(totalprice))) AS numdigits
            ,totalprice AS val
        FROM orders o
        ) o
    ) o
GROUP BY lowerbound
    ,upperbound
ORDER BY lowerbound

我的版本

SELECT lowerbound
    ,upperbound
    ,count(*) AS numorders
    ,min(val)
    ,max(val)
FROM (
    SELECT (left(totalprice,1)*power(10,len(floor(totalprice))-1))/1000 AS lowerbound
        ,((left(totalprice,1)+1)*power(10,len(floor(totalprice))-1))/1000 AS upperbound
        ,totalprice as val
        from orders) o
GROUP BY lowerbound
     ,upperbound
ORDER BY lowerbound

【问题讨论】:

  • 如果您呈现更改前的数据和更改后的预期数据,则更容易理解。

标签: sql histogram correctness


【解决方案1】:

为什么不使用特定列的 Min 和 Max,这样你就会得到上限和下限

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多