sql - HSQLDB 中的 PARTITION BY 替代方案

标签 sql hsqldb window-functions

我想触发 https://stackoverflow.com/a/3800572/2968357 中建议的查询在 HSQLDB 数据库上使用 选择 *

WITH tmpTable AS (
SELECT p.* ,
        ROW_NUMBER()  OVER(PARTITION BY p.groupColumn order by p.groupColumn desc) AS rowCount
  FROM sourceTable p) SELECT * FROM  tmpTable WHERE tmpTable.rowCount = 1

但收到以下错误:
Caused by: org.hsqldb.HsqlException: unexpected token: PARTITION required: )

意思分区由 不支持。

我在 HSQLDB 上的特定查询是否有解决方法?

最佳答案

HSQLDB 支持该答案中的第二个查询。如果您使用 HSQLDB DatabaseManager 和 insert test data来自其 options菜单,您将获得填充有数据并适用于此类查询的表。

SELECT MIN(x.id),  
     x.customerID, 
     x.total
FROM INVOICE x
JOIN (SELECT p.customerID,
             MAX(total) AS max_total
        FROM INVOICE p
    GROUP BY p.customerID) y ON y.customerID = x.customerID
                          AND y.max_total = x.total
GROUP BY x.customerID, x.total

但是当你想从两个表中进行选择时,HSQLDB 中有一个有趣的替代方案,它表现得非常好:
SELECT INV.* FROM CUSTOMER, 
LATERAL (SELECT ID, CUSTOMERID, CUSTOMER.FIRSTNAME, TOTAL 
FROM INVOICE  
WHERE CUSTOMERID = CUSTOMER.ID 
ORDER BY TOTAL, ID LIMIT 1) INV

此查询返回如下结果:
ID CUSTOMERID FIRSTNAME TOTAL   
-- ---------- --------- ------- 
1  0          Laura     2700.90 
36 1          Robert    4761.60 
27 3          Michael   3420.30 
12 4          Bill      3867.30 

关于sql - HSQLDB 中的 PARTITION BY 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36737540/

相关文章:

mysql - if语句: when date field is 1 month or older

hibernate - 使用 spring、maven 和 hibernate 时,启动 HSQLDB 进行单元测试的最佳方式是什么?

java - SimpleJdbcTestUtils.executeScript 和多行脚本

sql - 查找下一行的时差

sql - 计数最大值每天并发用户 session 数

sql - 将不同表中的两列连接成一列

sql - 使用 SQL 脚本创建用户、映射到数据库并为该数据库分配角色

mysql - SQL 从 'custom' post_type 中获取 X 个最后条目,计算用户自定义 post_type 的个人数量

mysql - 将 MySQL 查询转换为 HSQLDB 和 Oracle 查询

sql - postgresql:按列分组/Windows函数/最小-最大和复杂查询