Могу ли я написать вложенный запрос в KSQL?

#apache-kafka #ksqldb

#apache-kafka #ksqldb

Вопрос:

Я новичок в 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’ не является допустимым именем потока / таблицы или псевдонимом.’

В любом случае, для меня это сработает? Спасибо!

Ответ №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
  

Имейте в виду, что join — это совсем другое значение, чем в мире реляционных баз данных, здесь данные разделяются с помощью ключей в нескольких сегментах, и концептуально это «совместное размещение» join. более подробная информация о временном окне здесь.

Надеюсь, это поможет.

Комментарии:

1. Если я хочу результат «Общего количества», «Количества для статуса 3» и «Количества для статуса 5», означает ли это, что я должен создать другой поток для status = ‘3’? Поскольку мой текущий поток tb3_withdraw_record_summary не фильтрует никакого статуса.

2. Чтобы упростить себе жизнь, попробуйте разделить больший фрагмент sql на меньший поток и объединить потоки конечных результатов в соответствии с бизнес-логикой. Робин Моффатт привел отличный пример аналогичного варианта использования. Вот ссылка. — confluent.io/blog/atm-fraud-detection-apache-kafka-ksql

Ответ №2:

Функциональность вложенного запроса не реализована для KSQL.

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;
  

Комментарии:

1. «Не существует агрегатной функции SUM с нулевым типом аргумента!» К сожалению, это не работает, оно возвращает это сообщение об ошибке.

2. @kurapika . . . Это особенно любопытно, потому что нет NULL , если только amount не есть NULL . Но SUM() должен справиться с этим без проблем.