开发者社区> 问答> 正文

ClickHouse不支持group by ... limit by语法

查询语句如下:

SELECT asset_id, statistics_year, statistics_month, rent_rate, average_rent FROM dw_asset_operating_summary WHERE rent_rate IS NOT NULL AND average_rent IS NOT NULL AND is_del = toInt8(0) GROUP BY asset_id, statistics_year, statistics_month, rent_rate, average_rent ORDER BY asset_id, statistics_year DESC, statistics_month DESC LIMIT 1 BY asset_id

报错如下:

Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :' LIMIT 1 BY asset_id) t4 ON t3.asset_id', expect ), actual BY, pos 1630, line 21, column 34, token BY at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:573) at com.alibaba.druid.sql.parser.SQLParser.accept(SQLParser.java:581) at com.alibaba.druid.sql.parser.SQLSelectParser.parseTableSourceRest(SQLSelectParser.java:1324) at com.alibaba.druid.sql.parser.SQLSelectParser.parseTableSourceRest(SQLSelectParser.java:1189) at com.alibaba.druid.sql.parser.SQLSelectParser.parseTableSource(SQLSelectParser.java:1100) at com.alibaba.druid.sql.parser.SQLSelectParser.parseFrom(SQLSelectParser.java:1002) at com.alibaba.druid.sql.parser.SQLSelectParser.query(SQLSelectParser.java:447) at com.alibaba.druid.sql.parser.SQLSelectParser.query(SQLSelectParser.java:378) at com.alibaba.druid.sql.parser.SQLSelectParser.select(SQLSelectParser.java:61) at com.alibaba.druid.sql.parser.SQLSelectParser.parseTableSource(SQLSelectParser.java:1011) at com.alibaba.druid.sql.parser.SQLSelectParser.parseFrom(SQLSelectParser.java:1002) at com.alibaba.druid.sql.parser.SQLSelectParser.query(SQLSelectParser.java:447) at com.alibaba.druid.sql.parser.SQLSelectParser.query(SQLSelectParser.java:378) at com.alibaba.druid.sql.parser.SQLSelectParser.select(SQLSelectParser.java:61) at com.alibaba.druid.sql.parser.SQLStatementParser.parseSelect(SQLStatementParser.java:4190) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:204) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:124) at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:630) at com.alibaba.druid.wall.WallProvider.check(WallProvider.java:584) at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:826) ... 134 common frames omitted

原提问者GitHub用户stone5751

展开
收起
山海行 2023-07-05 18:07:38 280 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    ClickHouse 支持 LIMIT BY 语法,可以在 GROUP BY 子句中使用。这个语法的作用是限制每个分组返回的行数,类似于 SQL 中的 LIMIT 子句。

    以下是一个使用 LIMIT BY 语法的示例 SQL 语句:

    sql
    Copy
    SELECT
    group_column,
    any(non_group_column)
    FROM
    mytable
    GROUP BY
    group_column
    LIMIT 10 BY group_column
    在上面的 SQL 语句中,使用 GROUP BY 子句按 group_column 字段进行分组,并在分组后使用 LIMIT 10 BY group_column 语句限制每个分组返回的行数为 10。同时,使用 ANY 聚合函数来选择任意一行非分组列的值。

    2023-07-30 20:35:08
    赞同 展开评论 打赏
  • 问题已修复,请用新版本

    https://github.com/alibaba/druid/releases/tag/1.2.6

    原回答者GitHub用户wenshao

    2023-07-06 10:43:36
    赞同 展开评论 打赏
  • 根据报错信息,可以看出查询语句中存在语法错误。错误的位置在 LIMIT 1 BY asset_id 这一部分。

    这是因为 LIMIT BY 子句不是标准SQL的一部分,它可能是特定数据库或工具的扩展。如果你使用的是MySQL,正确的语法应该是 GROUP BY asset_id LIMIT 1

    所以,尝试将查询语句改为如下形式:

    SELECT asset_id, statistics_year, statistics_month, rent_rate, average_rent 
    FROM dw_asset_operating_summary 
    WHERE rent_rate IS NOT NULL 
        AND average_rent IS NOT NULL 
        AND is_del = toInt8(0) 
    GROUP BY asset_id, statistics_year, statistics_month, rent_rate, average_rent 
    ORDER BY asset_id, statistics_year DESC, statistics_month DESC 
    GROUP BY asset_id 
    LIMIT 1
    

    请注意,我将 LIMIT BY 替换为了 GROUP BY asset_id LIMIT 1。再次执行查询语句,应该能够成功运行。

    2023-07-05 19:02:37
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
阿里云 ClickHouse 企业版技术白皮书 立即下载
ClickHouse在手淘流量分析应用实践Jason Xu 立即下载
云数据库clickhouse最佳实践 立即下载