2017-02-15 11 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 

이 작동합니다.

오라클에서 파티션을 사용하여 똑같은 작업을 시도했지만 효과가있었습니다. 그러나 더비는 파티셔닝을 지원하지 않습니다. 윈도우가 있지만 그것을 사용할 수 없습니다.

오라클 하나

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를 사용해야합니다.

원하는 출력 2003 "OLAP 작업"지원이 불완전하다 SQL이

당신이다시피
 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는 row_number 기능을 가지고 있지만 Derby는 (현재) partition by을 가지고 있지 않습니다.

+0

현재 Derby에서이 작업을 수행하는 다른 방법이 없다는 뜻입니까? – OmerHalit