使用GROUP BY的标准偏差的SQL查询?

Gad*_*ion 3 sql group-by function monetdb

我在标准偏差函数方面遇到了一些问题(具体来说是MonetDB中的stddev_samp).我尝试了以下查询但没有成功:

    select industry, avg(marketcap) as industryavg, stddev_samp(marketcap) as industrysd from cumulativeview group by industry
    select  stddev_samp(marketcap) as industrysd from cumulativeview group by industry
Run Code Online (Sandbox Code Playgroud)

每个都给了我一个非常奇怪的例外,似乎stddev函数不能按子集对组进行操作,但是单独使用avg函数似乎在子集上工作得很好,如下面的查询:

    select industry, avg(marketcap) as industryavg  from cumulativeview group by industry
Run Code Online (Sandbox Code Playgroud)

当我使用where子句而不是group by时,标准偏差函数工作得很好:

    select  stddev_samp(marketcap) as industrysd from cumulativeview where industry='Diversified Investments'
Run Code Online (Sandbox Code Playgroud)

是否有另一种方法来编写一个查询,它可以同时为每个行业提供平均值和标准差,而不必为每个行业编写单独的查询?我很困惑为什么普通函数与group by和stddev不兼容...

Han*_*sen 6

刚刚在MonetDB的Oct2014版本中对此进行了测试.从您的查询中,我推断出以下表结构:

CREATE TABLE cumulativeview (industry string, company string, marketcap double);
Run Code Online (Sandbox Code Playgroud)

一些样本数据:

INSERT INTO cumulativeview VALUES ('Automotive', 'Daimler', 84784.62), 
('Automotive', 'BMW', 66852.15), ('Automotive', 'VW', 95378.54), ('Chemical', 'BASF', 70438.13), ('Chemical', 'Bayer', 105766.62);
Run Code Online (Sandbox Code Playgroud)

和你的查询

SELECT industry, avg(marketcap) AS industryavg, stddev_samp(marketcap) AS industrysd FROM cumulativeview GROUP BY industry;
Run Code Online (Sandbox Code Playgroud)

结果是

+------------+--------------------------+--------------------------+
| industry   | industryavg              | industrysd               |
+============+==========================+==========================+
| Automotive |       82338.436666666661 |       14419.659887918069 |
| Chemical   |                88102.375 |       24981.014848081126 |
+------------+--------------------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

正如安东尼所说,这个错误似乎是固定的.