2017-02-15 15 views
1

以下の表の構造を持っています。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 

答えて

0

です。

最初の作業がありましたが(https://wiki.apache.org/db-derby/OLAPOperations参照)、その作業は部分的にしか完了していません。

私は現在、このエリアのDerbyに他の機能を追加しようとしている人はいません。

したがって、Derbyはrow_number関数を持ちますが、Derbyは(現在)partition byを持っていません。

+0

現時点でDerbyでこの操作を実行する方法は他にありませんか? – OmerHalit