Nice video. How about creating another stream with the heartbeat data, say generating event every 1 min. Then you can run a tumble window for these 2 streams unioned. If for a window, there are only events for heartbeat data type, then it means the original stream has not received any data. This approach can keep the original data clean. SQL like this: WITH cte AS (SELECT 'real' as type, * FROM stream1 UNION SELECT 'datagen' as type, * FROM datagen) SELECT window_start, type, count(1) as cnt FROM tumble(cte,1m) GROUP BY window_start, type HAVING cnt=0