我有以下表格结构。德比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
这是否意味着目前在德比没有其他方式执行此操作? – OmerHalit