【问题标题】:Derby DB last x row averageDerby DB 最后 x 行平均值
【发布时间】:2017-02-15 12:27:18
【问题描述】:

我有如下表结构。

   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 DB。我需要在 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 中使用分区做同样的事情,并且成功了。但是 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

【问题讨论】:

    标签: sql derby window-functions


    【解决方案1】:

    您已经注意到,Derby 对 SQL 2003“OLAP 操作”的支持是不完整的。

    有一些初步工作(请参阅https://wiki.apache.org/db-derby/OLAPOperations),但这项工作只完成了部分。

    我认为目前没有人致力于为 Derby 在这方面添加更多功能。

    所以是的,Derby 有一个row_number 函数,但是不,Derby(目前)没有partition by

    【讨论】:

    • 这是否意味着目前在 Derby 中没有其他方法可以执行此操作?
    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2020-10-23
    • 1970-01-01
    相关资源
    最近更新 更多