Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何按最后20天分组并执行聚合功能?_Ruby On Rails_Postgresql - Fatal编程技术网

Ruby on rails 如何按最后20天分组并执行聚合功能?

Ruby on rails 如何按最后20天分组并执行聚合功能?,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,我似乎无法理解这一点。我试图得到过去20天内一列的标准偏差。这是我的 Model.where('date < ?','2013-03-25') .group('date') .order('date DESC') .limit(20) .select('stddev_samp(percent_change) as stdev') 型号,其中('date

我似乎无法理解这一点。我试图得到过去20天内一列的标准偏差。这是我的

Model.where('date < ?','2013-03-25')
     .group('date')
     .order('date DESC')
     .limit(20)
     .select('stddev_samp(percent_change) as stdev')
型号,其中('date<?','2013-03-25')
.group(“日期”)
.订单(“日期说明”)
.限额(20)
.选择('stddev_samp(百分比变化)作为stdev')
然而,我得到的是20条零分。我希望输入1个标准偏差

在将stddev_samp转换为sum之后,我看到我得到了零,因为1个条目不能有标准偏差。也就是说,它不是像我预期的那样对20个数据进行分组,而是计算每个日期的标准偏差

所以我的问题是,如何获得过去20天的STDEV?我知道可以简单地选择
select percent\u change
,然后用ruby计算标准偏差,但我假设聚合函数stddev\u samp在这种情况下应该是可用的


我使用的是rails 3.2和Postgresql 9.2,我不是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;

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

红宝石:

SQL:

SQL:

选择stddev\u samp(变化百分比)作为stdev
从…起
按日期说明订购
上限20;

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

此外,如果一个日期有多个值或缺少一个日期,则限制可能不起作用

试试这个:

SELECT stddev_samp(percent_change) as stdev
FROM
(SELECT percent_change
FROM tbl
WHERE date > now() - interval '20 days') AS q

首先,你要的是最后20天,不是最后20张唱片。对于这一部分,我想你需要
。where(“date>=?”,Time.zone.today-20.days)
。等等,我最后的评论可能真的很愚蠢。反正我会把它放在那里。@Jasonswitt哈哈,没问题……我定了日期,这样最后20条记录就是信息的最后20天。是的,看起来既然你是按日期分组的,每条记录都是一天。我在这里要做的是编写完成所需操作的原始SQL,然后将其转换为ActiveRecord语法。我也计划自己马上试一试。泰,但是,有没有办法让最后20个参赛作品与今天的20个相比呢?原因是因为这是股价数据,而且股票在周六、周日、节假日等都没有开盘,所以这几天有空位。假设数据库是MySQL,您只需要最后20条记录:选择stddev_samp(百分比变化)作为stddev from order by date desc limit 20;这在mysql上可能会起作用……我收到一个postgresql错误,它说,
列日期必须出现在GROUP BY子句中或与聚合函数一起使用,它指向
order('date desc')
你能发布你正在尝试的整个sql语句吗?
Model.order('date desc')。limit(20)。select('stddev_samp(百分比变化)正如stdev')
告诉我的那样。知道这一点可能很重要,当我弄明白它的时候,我还将在末尾添加一个
。where('asset_symbol=?,'yhoo')
,但它看起来不像
where
是问题所在
Model.where('date >= ?', Date.today - 20.days).select('stddev_samp(percent_change) as stdev').first['stdev']
select stddev_samp(percent_change) as stdev 
from <table> 
where date >= now() - interval 20 day;
Model.order('date desc').limit(20).select('stddev_samp(percent_change) as stdev').first['stdev']
select stddev_samp(percent_change) as stdev 
from <table> 
order by date desc
limit 20;
SELECT stddev_samp(percent_change) as stdev
FROM
(SELECT percent_change
FROM tbl
WHERE date > now() - interval '20 days') AS q