#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.
Ответ №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()
должен справиться с этим без проблем.