2017-02-15 140 views
1

我有以下表格结构。德比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数据库。我需要在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这样:

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中使用分区做同样的事情,它的工作。但德比不支持分区。有WINDOW,但我无法使用它。

甲骨文一个

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德比对于它的便携性。

所需的输出是这

 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),但该工作只是部分完成。

我不相信任何人目前正致力于在此领域向德比添加更多功能。

所以是的,德比有一个row_number函数,但没有,德比不(当前)有partition by

+0

这是否意味着目前在德比没有其他方式执行此操作? – OmerHalit