1

私はこれを理解できないようです。過去 20 日間の列の標準偏差を取得しようとしています。これが私が持っているものです

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

ただし、得られるのは Nil の 20 エントリだけです。標準偏差の 1 つのエントリを期待していました。

stddev_samp を合計に切り替えた後、1 つのエントリで標準偏差を取得できないため、nil になっていることがわかります。つまり、期待どおりに20をグループ化していませんが、各日付の標準偏差を計算しています。

私の質問は、過去 20 日間の stddev を取得するにはどうすればよいですか? ruby で単純に標準偏差を選択select percent_changeして計算できることはわかっていますが、この場合は集計関数 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 日間ではなく、LAST 20 RECORDS を使用する場合:

ルビー:

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;

これは、それらの合計ではなく、各日の偏差を個別に計算します。また、1 つの要素のみの偏差を取得しようとすると、 が得られます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

日付ごとに 1 つの値が必要ないため、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 に答える