【问题标题】:When querying H2 I get a SQL Syntax Error 42001-197查询 H2 时出现 SQL 语法错误 42001-197
【发布时间】:2023-01-12 20:59:55
【问题描述】:

我绝不是 SQL 专家,也不是 H2,所以请随意将我拖入困境。我有两个表,一个名为 ORDERS,一个名为 PRODUCTS,我试图显示数据中每年可用的前三个销售类别。

运行以下 SQL 时:

WITH year_categories AS ( 
    SELECT EXTRACT(YEAR FROM ORDERS.CREATED_AT) AS year, 
    PRODUCTS.CATEGORY AS "Category", 
    SUM(ORDERS.TOTAL) AS total_sales 
    FROM ORDERS JOIN PRODUCTS 
    ON ORDERS.PRODUCT_ID = PRODUCTS.ID 
    GROUP BY year, PRODUCTS.CATEGORY 
) 
SELECT year, "Category", total_sales 
FROM ( 
    SELECT year, "Category", total_sales, 
    ROW_NUMBER() OVER (PARTITION BY year ORDER BY total_sales DESC) as row_num
    FROM year_categories 
) sub 
WHERE sub.row_num <= 3 
ORDER BY year, total_sales DESC;

我收到以下错误:

块引用 SQL 语句中的语法错误 WITH YEAR_CATEGORIES AS ( SELECT EXTRACT(YEAR FROM ORDERS.CREATED_AT) AS YEAR, PRODUCTS.CATEGORY AS ""Category", SUM(ORDERS.TOTAL) AS TOTAL_SALES FROM ORDERS JOIN PRODUCTS ON ORDERS.PRODUCT_ID = PRODUCTS .ID GROUP BY YEAR, PRODUCTS.CATEGORY ) SELECT YEAR, ""Category", TOTAL_SALES FROM ( SELECT YEAR, ""Category", TOTAL_SALES, ROW_NUMBER() OVER (PARTITION[*] BY YEAR ORDER BY TOTAL_SALES DESC) AS ROW_NUM FROM YEAR_CATEGORIES ) SUB WHERE SUB.ROW_NUM <= 3 ORDER BY YEAR, TOTAL_SALES DESC; ";预期的 ”)”; SQL语句:WITH year_categories AS ( SELECT EXTRACT(YEAR FROM ORDERS.CREATED_AT) AS year, PRODUCTS.CATEGORY AS "Category", SUM(ORDERS.TOTAL) AS total_sales FROM ORDERS JOIN PRODUCTS ON ORDERS.PRODUCT_ID = PRODUCTS.ID GROUP BY year , PRODUCTS.CATEGORY ) SELECT year, "Category", total_sales FROM ( SELECT year, "Category", total_sales, ROW_NUMBER() OVER (PARTITION BY year ORDER BY total_sales DESC) as row_num FROM year_categories ) sub WHERE sub.row_num <= 3 ORDER BY year, total_sales DESC; [42001-197]

我究竟做错了什么?我试过在 ROW_NUM 之后的几个不同位置插入“)”,但没有不同的结果。或者,是否有更简单或更好的方法来构造此查询?

提前感谢您的帮助!

【问题讨论】:

    标签: sql h2


    【解决方案1】:

    最明显的解释是您的 H2 版本/模式不支持公用表表达式。您可以尝试内联所有内容。此外,您的查询可以简化:

    SELECT year, Category, total_sales 
    FROM
    (
        SELECT EXTRACT(YEAR from o.CREATED_AT) AS year, 
               p.CATEGORY AS Category,
               SUM(o.TOTAL) AS total_sales,
               RANK() OVER (PARTITION BY EXTRACT(YEAR from o.CREATED_AT)
                            ORDER BY SUM(o.TOTAL) DESC) rnk
        FROM ORDERS o
        INNER JOIN PRODUCTS p ON o.PRODUCT_ID = p.ID 
        GROUP BY year, Category
    ) t
    WHERE rnk <= 3;
    

    我从 ROW_NUMBER() 切换到 RANK(),但您可能还想改用 DENSE_RANK(),具体取决于您的要求。

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 2014-11-03
      • 1970-01-01
      相关资源
      最近更新 更多