以下の表の構造を持っています。Derby DB最終x行平均
ITEM TOTAL
----------- -----------------
ID | TITLE ID |ITEMID|VALUE
1 A 1 2 6
2 B 2 1 4
3 C 3 3 3
4 D 4 3 8
5 E 5 1 2
6 F 6 5 4
7 4 5
8 2 8
9 2 7
10 1 3
11 2 2
12 3 6
私はApache Derby DBを使用しています。私はSQLで平均計算を実行する必要があります。アイテムIDのリストと最後の3レコードの平均合計を表示する必要があります。 つまり、ITEM.ID 1の場合、TOTALテーブルに行き、ITEMID 1に関連付けられている行の最後の3レコードを選択します。それらの平均をとってください。 Derbyデータベースでは、特定のアイテムIDに対してこれを実行できますが、特定のIDを指定せずには作成できません。私が何をしたのかを教えてください。
SELECT ITEM.ID, AVG(VALUE) FROM ITEM, TOTAL WHERE TOTAL.ITEMID = ITEM.ID GROUP BY ITEM.ID
このSQLは、リスト内のすべてのアイテムの平均を示します。しかし、これは合計テーブルのすべての値を計算します。私は最後の3つのレコードだけが必要です。だから私はこれにSQLを変更:私はアイテムID 1または2などを供給しかし、私はアイテムのIDを与えることなく、すべてのアイテムのためにこれを行うことができない場合
SELECT AVG(VALUE) FROM (SELECT ROW_NUMBER() OVER() AS ROWNUM, TOTAL.* FROM TOTAL WHERE ITEMID = 1) AS TR WHERE ROWNUM > (SELECT COUNT(ID) FROM TOTAL WHERE ITEMID = 1) - 3
これは動作します。
パーティションを使って同じことをオラクルでやろうとしましたが、うまくいきました。しかし、derbyはパーティショニングをサポートしていません。窓がありますが、私はそれを利用できませんでした。
Oracleの1
SELECT ITEMID, AVG(VALUE) FROM(SELECT ITEMID, VALUE, COUNT(*) OVER (PARTITION BY ITEMID) QTY, ROW_NUMBER() OVER (PARTITION BY ITEMID ORDER BY ID) IDX FROM TOTAL ORDER BY ITEMID, ID) WHERE IDX > QTY -3 GROUP BY ITEMID ORDER BY ITEMID
私はその移植性のためにダービーDBを使用する必要があります。
所望の出力は、あなたが気づいたように、SQL 2003「OLAP操作」支援のためのダービーのサポートが不完全である。この
RESULT
-----------------
ITEMID | AVERAGE
1 (9/3)
2 (17/3)
3 (17/3)
4 (5/1)
5 (4/1)
6 NULL
現時点でDerbyでこの操作を実行する方法は他にありませんか? – OmerHalit