【问题标题】:Can I write sub query in KSQL?我可以在 KSQL 中编写子查询吗?
【发布时间】:2019-08-01 13:25:27
【问题描述】:

我是ksql 的新手,并且使用mysql 的时间最长。 我想知道KSQL中有子查询吗?

这个查询没有任何问题:

SELECT a.executedate, count(a.pno), sum(a.amount) FROM
tb3_withdraw_record_summary a WHERE a.status='3' GROUP BY
a.executedate;

而此查询返回错误消息:

SELECT a.executedate, count(a.pno), sum(a.amount), (SELECT COUNT(b.pno)
FROM tb3_withdraw_record_summary b WHERE b.status='5' AND
b.executedate = a.executedate) FROM tb3_withdraw_record_summary a
WHERE a.status='3' GROUP BY a.executedate

'准备语句失败:'B' 不是有效的流/表名或别名。 原因:'B' 不是有效的流/表名称或别名。'

无论如何让我完成这项工作?谢谢!

【问题讨论】:

    标签: apache-kafka ksqldb


    【解决方案1】:

    Ksql 目前不支持嵌套查询功能,但您可以通过以下方式进行 -

    1) CREATE STREAM B AS SELECT COUNT(b.pno)
    FROM tb3_withdraw_record_summary b WHERE b.status='5';
    2) SELECT a.executedate, count(a.pno), sum(a.amount) FROM tb3_withdraw_record_summary a JOIN B within 5 hours ON b.executedate = a.executedate WHERE a.status='3' GROUP BY a.executedate
    

    请记住,连接与关系数据库世界的含义截然不同,这里的数据通过多个存储桶中的键进行分区,从概念上讲,它是一个“同地”连接。有关time-window 的更多详细信息,请点击此处。

    希望它会有所帮助。

    【讨论】:

    • 如果我想要“总计数”、“状态 3 计数”和“状态 5 计数”的结果,这是否意味着我必须为状态 = '3 创建另一个流'?因为我当前的 tb3_withdraw_record_summary 流没有过滤任何状态。
    • 为了让生活更轻松,请尝试将较大的 sql 块划分为较小的流,并根据业务逻辑连接最终结果流。 Robin Moffatt 就类似的用例提供了一个很好的例子。链接在这里。 - confluent.io/blog/atm-fraud-detection-apache-kafka-ksql
    【解决方案2】:

    没有为 KSQL 实现 SubQuery 功能。

    https://github.com/confluentinc/ksql/issues/745

    【讨论】:

      【解决方案3】:

      我不熟悉 KSQL,但也许这可以满足您的需求:

      SELECT wrs.executedate,
             SUM(CASE WHEN wrs.status IN ('3') THEN 1 ELSE 0 END), 
             SUM(CASE WHEN wrs.status IN ('3') THEN amount ELSE 0 END), 
             SUM(CASE WHEN wrs.status IN ('5') THEN 1 ELSE 0 END) 
      FROM tb3_withdraw_record_summary wrs
      WHERE wrs.status IN ('3', '5')
      GROUP BY wrs.executedate;
      

      【讨论】:

      • "不存在具有空参数类型的 SUM 聚合函数!"遗憾的是这不起作用,它返回此错误消息。
      • @kurapika 。 . .这特别奇怪,因为没有NULL,除非amountNULL。但是SUM() 应该可以毫无问题地处理。
      猜你喜欢
      • 2021-04-20
      • 2020-01-30
      • 2011-06-17
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多