2017-02-15 12 views
1

У меня есть следующая структура таблицы.Derby DB last x row average

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 

Я использую DB Apache Derby. Мне нужно выполнить средний расчет в SQL. Мне нужно показать список идентификаторов элементов и их среднее количество последних 3 записей. То есть для ITEM.ID 1 я перейду в таблицу TOTAL и выберем последние 3 записи строк, которые связаны с ITEMID 1. И возьмите их среднее значение. В базе данных Derby я могу сделать это для данного идентификатора элемента, но я не могу сделать это, не указывая конкретный идентификатор. Позвольте мне показать вам, что я сделал.

SELECT ITEM.ID, AVG(VALUE) FROM ITEM, TOTAL WHERE TOTAL.ITEMID = ITEM.ID GROUP BY ITEM.ID 

Этот SQL дает среднее значение для всех элементов в списке. Но это вычисляет для всех значений общих таблиц. Мне нужны только последние 3 записи. Поэтому я изменил SQL к этому:

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 

Это работает, если я поставить элемент ID 1 или 2 и т.д. Но я не могу сделать это для всех элементов, не давая идентификатор элемента.

Я попытался сделать то же самое в ORACLE, используя раздел, и он сработал. Но дерби не поддерживает разделение. Есть ОКНО, но я не мог использовать его.

Oracle один

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 

мне нужно использовать базу данных для дерби своей портативности.

Нужный выход это

 RESULT 
----------------- 
ITEMID | AVERAGE 
    1   (9/3) 
    2   (17/3) 
    3   (17/3) 
    4   (5/1) 
    5   (4/1) 
    6   NULL 

ответ

0

Как вы уже заметили, поддержка Дерби для SQL 2003 Поддержка «OLAP операций» является неполным.

Была начальная работа (см. https://wiki.apache.org/db-derby/OLAPOperations), но эта работа была только частично завершена.

Я не верю, что кто-то сейчас работает над добавлением большего количества функций в Дерби в этой области.

Да, у Derby есть функция row_number, но нет, Derby не имеет (в настоящее время) partition by.

+0

Означает ли это, что в настоящее время в Дерби нет другого способа выполнить эту операцию? – OmerHalit

 Смежные вопросы

  • Нет связанных вопросов^_^