У меня есть следующая структура таблицы.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
Означает ли это, что в настоящее время в Дерби нет другого способа выполнить эту операцию? – OmerHalit