Derby DB 最后 x 行平均值
Derby DB last x row average
我有以下 table 结构。
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 table 和 select 与 ITEMID 1 关联的行的最后 3 条记录。并取它们的平均值。在 Derby 数据库中,我可以为给定的项目 ID 执行此操作,但如果不提供特定的 ID,我将无法执行此操作。让我告诉你我做了什么。
SELECT ITEM.ID, AVG(VALUE) FROM ITEM, TOTAL WHERE TOTAL.ITEMID = ITEM.ID GROUP BY ITEM.ID
此 SQL 给出列表中所有项目的平均值。但这计算了总 table 的所有值。我只需要最后 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不支持分区。有 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
我需要使用 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 Operations" 的支持是不完整的。
有一些初步工作(参见 https://wiki.apache.org/db-derby/OLAPOperations),但该工作仅完成了一部分。
我认为目前没有人在这方面致力于为 Derby 添加更多功能。
所以是的,Derby 有一个 row_number
函数,但是不,Derby(目前)没有 partition by
.
我有以下 table 结构。
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 table 和 select 与 ITEMID 1 关联的行的最后 3 条记录。并取它们的平均值。在 Derby 数据库中,我可以为给定的项目 ID 执行此操作,但如果不提供特定的 ID,我将无法执行此操作。让我告诉你我做了什么。
SELECT ITEM.ID, AVG(VALUE) FROM ITEM, TOTAL WHERE TOTAL.ITEMID = ITEM.ID GROUP BY ITEM.ID
此 SQL 给出列表中所有项目的平均值。但这计算了总 table 的所有值。我只需要最后 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不支持分区。有 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
我需要使用 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 Operations" 的支持是不完整的。
有一些初步工作(参见 https://wiki.apache.org/db-derby/OLAPOperations),但该工作仅完成了一部分。
我认为目前没有人在这方面致力于为 Derby 添加更多功能。
所以是的,Derby 有一个 row_number
函数,但是不,Derby(目前)没有 partition by
.