Sql Derby DB最后x行平均值

Sql Derby DB最后x行平均值,sql,derby,window-functions,Sql,Derby,Window Functions,我有下面的表结构 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

我有下面的表结构

   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
我正在使用ApacheDerbyDB。我需要用SQL执行平均值计算。我需要显示项目ID的列表以及最后3条记录的平均总数。 也就是说,对于ITEM.id1,我将转到TOTAL表并选择与itemid1关联的行的最后3条记录。取平均值。在Derby数据库中,我可以对给定的项目ID执行此操作,但如果不提供特定的ID,则无法执行此操作。让我向您展示我所执行的操作

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等,则此操作有效。但如果不提供项目ID,我无法对所有项目执行此操作

我试着在ORACLE中使用分区做同样的事情,结果成功了。但是derby不支持分区。有一扇窗户,但我不能利用它

甲骨文一号

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
为了便于移植,我需要使用derby DB

所需的输出如下所示

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

正如您所注意到的,Derby对SQL 2003“OLAP操作”支持的支持是不完整的

有一些初步的工作(见),但这项工作只是部分完成

我认为目前还没有人在这方面为Derby添加更多功能


因此,是的,Derby有一个
行号
功能,但不是,Derby(目前)没有
分区

这是否意味着目前没有其他方法在Derby中执行此操作?