【问题标题】:PARTITION BY doesn't work in H2 dbPARTITION BY 在 H2 db 中不起作用
【发布时间】:2025-12-24 05:45:06
【问题描述】:

我正在使用 PARTITION BY 子句对结果进行排序。此问题Sql Order by on multiple column 中提到了使用 PARTITION BY 的详细信息。当我在 Oracle 中运行时,它工作正常。我将 H2 db 用于我的单元测试用例。当我在 H2 db 上运行相同的查询时,它不起作用。是 H2 中的已知问题吗?是否有任何替代解决方案可以同时在 Oracle 和 H2 中运行。

【问题讨论】:

    标签: oracle h2


    【解决方案1】:

    我认为 H2 不支持窗口函数(也称为分析函数)。但是,您可以使用标准 SQL 在链接中进行查询:

    SELECT t.*
    FROM yourtable t join
         (select vendorname, max(incidentdate) as maxdate
          from yourtable yt
          group by vendorname
         ) vn
         on vn.vendorname = yt.vendorname
    ORDER BY vn.maxDate DESC, t.VendorName ASC, t.IncidentDate DESC;
    

    虽然这应该在两种环境中运行,over 形式在 SQL 中可能表现更好。

    【讨论】:

    • 性能甚至比不上。我仍在寻找可用于测试这些查询的内存数据库。
    • 您的数据库有多大?除非您有大量数据,否则性能应该不会那么差。
    • 非常大(150m+ 个分区,>1B 每天插入)。这是一个大问题,我希望现在可以解决,因为分析是 ANSI 标准。我不会为了让功能测试更容易而降低可读性和性能。否则就是尾巴在摇狗。是否有任何嵌入式数据库支持分析(h2、hsql)?
    • @GordonLinoff:我的英雄。
    • 注意:这似乎多年来发生了变化,H2 支持分区。来源:h2database.com/html/functions-window.html