3
votes

Puis-je écrire une sous-requête dans KSQL?

Je suis nouveau dans ksql et j'utilise mysql depuis le plus longtemps. J'aimerais savoir s'il y a de toute façon des sous-requêtes dans KSQL ?

Cette requête fonctionne sans aucun problème:

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

Alors que cette requête retourne un message d'erreur:

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

'Échec de la préparation de l'instruction:' B 'n'est pas un nom ou un alias de flux / table valide. Provoqué par: "B" n'est pas un nom ou un alias de flux / table valide. "

Quoi qu'il en soit pour moi de faire ce travail? Merci!


0 commentaires

3 Réponses :


2
votes

La fonctionnalité de sous-requête n'est pas implémentée pour KSQL.

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


0 commentaires

0
votes

Je ne suis pas familier avec KSQL, mais c'est peut-être ce que vous voulez:

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;


2 commentaires

"Aucune fonction d'agrégation SUM avec un type d'argument nul n'existe!" Malheureusement, cela ne fonctionne pas, cela renvoie ce message d'erreur.


@kurapika. . . C'est particulièrement curieux, car il n'y a pas de NULL , à moins que amount soit NULL . Mais SUM () devrait gérer cela sans problème.



3
votes

La fonctionnalité de requête imbriquée n'est actuellement pas prise en charge par Ksql mais vous pouvez le faire de la manière suivante -

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

Gardez à l'esprit que la jointure a une signification très différente du monde de la base de données relationnelle, ici les données sont partitionné par des clés dans plusieurs compartiments et il s'agit conceptuellement d'une jointure «colocalisée». plus de détails sur time-window ici.

J'espère que cela vous aidera.


2 commentaires

Si je veux un résultat d'un "Nombre total", "Compte pour le statut 3" et "Compte pour le statut 5", cela signifie-t-il que je dois créer un autre flux pour le statut = "3"? Comme mon flux tb3_withdraw_record_summary actuel est sans filtrer aucun statut.


Pour vous simplifier la vie, essayez de diviser votre plus gros morceau de sql en un flux plus petit et de rejoindre les flux de résultats finaux selon la logique métier. Robin Moffatt a fourni un excellent exemple autour de cas d'utilisation similaires. Voici le lien. - confluent.io/blog/atm-fraud-detection-apache -kafka-ksql