こちらですが、下記のやり方であればテーブル結合不要になるのではないかと思います。
sql
1SELECT
2 CASE WHEN COUNT(*) < 3 THEN NULL ELSE AVG(usd_rate) END AS avv_usd_rage
3FROM
4 (SELECT * FROM `table` order by time desc limit 3) AS latest_table
※「直近3回分」のレコードを取得→3件あれば平均値を取得、2件未満ならNullを返します。
なお、2件未満の場合は「その時に存在する分の平均値」を取得するのであればCASE文は不要で
sql
1SELECT
2 AVG(usd_rate) AS avv_usd_rage
3FROM
4 (SELECT * FROM `table` order by time desc limit 3) AS latest_table
だけになります。
この結果を他のテーブル(table2)に入れる場合、手前にINSERT文を付ければOKです。
sql
1create table avg_table(time int unique,usd_rate double);
sql
1INSERT INTO avg_table
2SELECT
3 MAX(time) AS time,
4 CASE WHEN COUNT(*) < 3 THEN NULL ELSE AVG(usd_rate) END AS avg_usd_rage
5FROM
6 (SELECT * FROM `table` order by time desc limit 3) AS latest_table
※同じ時間帯に対して複数回実行する可能性がある場合は、
後から来たデータを優先する場合: INSERT INTO → REPLACE INTO
先に格納されていたデータを優先する場合: INSERT INTO → INSERT IGNORE INTO
に変更してください。