Могу ли я написать подзапрос в KSQL? - PullRequest
1 голос
/ 11 марта 2019

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

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

Ответы [ 3 ]

1 голос
/ 11 марта 2019

функция вложенных запросов в настоящее время не поддерживается 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 здесь.

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

1 голос
/ 11 марта 2019

Функция SubQuery не реализована для KSQL.

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

0 голосов
/ 11 марта 2019

Я не знаком с 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;
...