part_idが見つかった最後の2つのバッチの各part_idの平均時間と、すべてのバッチの各part_idの平均時間を計算しようとしています。個別グループセットに属する最後のxレコードの平均を計算
最後に見つけた2つのバッチのpart_idのAverageを分離することができましたが、各パーツIDの計算を行うようにコードに統合することはできません。エラーが発生しました 'where句'の 'tst.part_id'列が不明です。そのtst.part_id値をネストされた選択クエリに渡す必要があります。
以下私が持っているフィドルです:私が使用しています
http://sqlfiddle.com/#!9/77bea5/85
問合せ:
SELECT tst.part_id,
AVG(tst.est_time) AS 'Average Time Overall',
(SELECT AVG(ft.avgLastMax)
FROM
(SELECT t2.avglst as 'avgLastMax', t2.numval as 'numval'
FROM (SELECT
@num:=CASE WHEN @last != tst3.batch_id
THEN @num:=(@num + 1)
ELSE @num:[email protected] END 'numval',
@last:=tst3.batch_id,
@name:=CASE WHEN @num > 2
THEN @name:[email protected]
ELSE @name:=(tst3.est_time) END 'avglst'
FROM test AS tst3,
(select @last:=0, @avg := 0, @name :=0 , @num :=0) var
/* GET AVERAGE FOR A SINGLE PART ID
WHERE tst3.part_id = 1 */
WHERE tst3.part_id = tst.part_id
ORDER BY tst3.run_id DESC) as t2
)
as ft
WHERE ft.numval <3) as 'AVG on last 2 batches'
FROM test AS tst
GROUP BY tst.part_id;
をここでは私が取得しようとしていますものです:
part_id AVG on last 2 batches Average Time Overall
1 27.25 25.67
2 22.5 22.5
3 16.67 16.67
4 47.5 47.5
表スキーマ:
CREATE TABLE test
(`part_id` int, `est_time` int, `batch_id` int, `run_id` int, `line` varchar(1))
;
INSERT INTO test
(`part_id`, `est_time`, `batch_id`, `run_id`, `line`)
VALUES
(1, 20, 1, 1, 'T'),
(1, 25, 1, 2, 'T'),
(2, 30, 1, 3, 'T'),
(3, 15, 1, 4, 'T'),
(1, 10, 2, 5, 'X'),
(4, 40, 2, 8, 'X'),
(2, 15, 3, 9, 'T'),
(3, 15, 3, 10, 'T'),
(3, 20, 3, 11, 'T'),
(1, 34, 4, 12, 'X'),
(1, 32, 4, 13, 'X'),
(1, 33, 4, 14, 'X'),
(4, 55, 5, 15, 'T')
;
EDITED:最後のbatch_idを取得するために、DESCによってtst3.run_idによってテーブルと順序が訂正されました。変数と
番号あなたの予想される出力では、加算されていないようです。例えば、 'part_id' 1は2つの直近のバッチに対して平均で' 32.5 'のようです。 –
私は間違って注文を裏返しましたが、part_id 1の場合は27.25でなければなりません。((33 + 32 + 34 + 10)/ 4) – barracuda
(part_id、batch_id、run_id)はUNIQUE/PRIMARYです。 – Strawberry