1

我似乎无法弄清楚这一点。我正在尝试获取过去 20 天的列的标准偏差。这是我所拥有的

Model.where('date < ?','2013-03-25')
     .group('date')
     .order('date DESC')
     .limit(20)
     .select('stddev_samp(percent_change) as stdev')

然而,我得到的只是 20 个 Nil 条目。我期待 1 个标准偏差条目。

将 stddev_samp 切换为 sum 后,我看到我得到了 nil,因为您不能在 1 个条目上获得标准偏差。即它没有像我预期的那样对 20 进行分组,而是计算每个日期的标准偏差。

所以我的问题是,我如何获得过去 20 天的 stddev?我知道可以简单地选择select percent_change然后计算 ruby​​ 中的标准偏差,但我认为聚合函数 stddev_samp 在这种情况下应该是可用的。

我正在使用 rails 3.2 和 Postgresql 9.2

4

3 回答 3

1

无需“分组依据”、“排序依据”或子选择。只需获取过去 20 天的记录并对其运行聚合函数即可。

红宝石:

Model.where('date >= ?', Date.today - 20.days).select('stddev_samp(percent_change) as stdev').first['stdev']

SQL:

select stddev_samp(percent_change) as stdev 
from <table> 
where date >= now() - interval 20 day;

如果您想使用最近 20 条记录,而不是过去 20 天:

红宝石:

Model.order('date desc').limit(20).select('stddev_samp(percent_change) as stdev').first['stdev']

SQL:

select stddev_samp(percent_change) as stdev 
from <table> 
order by date desc
limit 20;
于 2013-03-25T15:16:11.080 回答
1

我不是 Ruby 人,所以我会用普通的 SQL 来解释它:

你正在做的是:

SELECT stddev_samp(percent_change) as stdev
FROM tbl
WHERE date < '2013-03-25'
GROUP BY date
ORDER BY date DESC
LIMIT 20;

这会分别计算每一天的偏差,而不是它们的总和,当您尝试仅获得一个元素的偏差时,您会得到NULL. 删除GROUP BY将修复它,但也会返回整个表的结果,而不仅仅是最后 20 个条目,所以我们需要一个子查询:

SELECT stddev_samp(percent_change) as stdev
FROM
(SELECT percent_change
FROM tbl
WHERE date < '2013-03-25'
ORDER BY date DESC
LIMIT 20) AS q
于 2013-03-25T15:13:33.277 回答
0

您不需要 group by,因为您不希望每个日期都有一个值。

如果您有多个日期值或缺少日期,您的限制也可能不起作用

尝试这个:

SELECT stddev_samp(percent_change) as stdev
FROM
(SELECT percent_change
FROM tbl
WHERE date > now() - interval '20 days') AS q
于 2013-03-25T15:22:04.207 回答