Principe

Une push query envoie un flux continu de mises à jour.

S’abonne aux changements d’un stream ou d’une table.

La requête ne se termine jamais (sauf interruption explicite).

Résultat non persisté dans un topic Kafka (sauf CREATE … AS).

Syntaxe complète

SELECT select_expr [, ...]
FROM from_item
[[LEFT | FULL | INNER] JOIN join_item
  [WITHIN [<size> <timeunit> | (<before_size> <timeunit>, <after_size> <timeunit>)]
  [GRACE PERIOD <grace_size> <timeunit>]]
  ON join_criteria]*
[WINDOW window_expression]
[WHERE where_condition]
[GROUP BY grouping_expression]
[HAVING having_expression]
EMIT [CHANGES | FINAL]
[LIMIT count];

Exemple simple

Suivre toutes les températures en temps réel :

SELECT sensor_id, ville, temperature, ts
FROM iot_stream_data
EMIT CHANGES;

Affiche chaque nouveau message au fur et à mesure.

Exemple avec filtrage

Alertes pour températures supérieures à 30°C :

SELECT sensor_id, ville, temperature, ts
FROM iot_stream_data
WHERE temperature > 30
EMIT CHANGES;

N’émet que les événements satisfaisant la condition.

Exemple avec agrégation

Compte du nombre de mesures par ville :

SELECT
    ville,
    COUNT(*) AS nb_mesures
FROM iot_stream_data
WINDOW TUMBLING (SIZE 5 MINUTES)
GROUP BY ville
EMIT CHANGES;

Émet le compte mis à jour pour chaque fenêtre.

EMIT CHANGES vs EMIT FINAL

EMIT CHANGES : émet résultats intermédiaires au fur et à mesure.

EMIT FINAL : n’émet que le résultat final de chaque fenêtre (nécessite fenêtrage).

-- Résultats intermédiaires
SELECT ville, AVG(temperature) AS avg_temp
FROM iot_stream_data
WINDOW TUMBLING (SIZE 10 MINUTES)
GROUP BY ville
EMIT CHANGES;
 
-- Seulement résultat final de chaque fenêtre
SELECT ville, AVG(temperature) AS avg_temp
FROM iot_stream_data
WINDOW TUMBLING (SIZE 10 MINUTES)
GROUP BY ville
EMIT FINAL;