【问题标题】:PARTITION BY alternative in HSQLDBHSQLDB 中的 PARTITION BY 替代方案
【发布时间】:2016-04-20 08:06:01
【问题描述】:

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

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: )

表示不支持PARTITION BY

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

【问题讨论】:

  • 使用标题为任何数据库支持的答案部分
  • 谢谢,但是如何完成我刚刚添加到问题中的 select * 语句?
  • CTE (WITH .. AS) 查询不是必需的,除非您使用 ROW_NUMBER() OVER(PARTITION .. 语法。

标签: sql hsqldb window-functions


【解决方案1】:

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

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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多