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!
3 Réponses :
La fonctionnalité de sous-requête n'est pas implémentée pour KSQL.
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;
"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.
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.
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