Use Case

Enrich Every Event in Real Time with Streaming JOINs

Join streaming events with dimension tables, compute derived fields, and transform data on the fly — so downstream systems always work with complete, enriched records.

Live Enrichment Pipeline
streaming
Events Enriched/sec
127,400
● healthy throughput
JOIN Hit Rate
94.0%
● above threshold
Avg Latency
2.3ms
p99 < 5ms
Active Pipelines
34
across 3 clusters
See Live Demo

Trusted by 1,000+ Data-Driven Organizations

for Real-time Analytics

Trusted by 1,000+ Data-Driven Organizations for Real-time Analytics

The Problem

Are Your Downstream Systems Making Decisions on Raw, Un-Enriched Events?

Batch ETL enriches data every few hours. Between runs, your recommendation engine uses stale user profiles, your fraud system misses context from recent transactions, and your analytics dashboards show incomplete records.

With RisingWave

Enrich Every Event the Moment It Arrives

RisingWave performs streaming JOINs — continuously matching events with the latest dimension data. User profiles, product catalogs, geo lookups — all joined in real time with standard SQL.

Streaming JOINs
Join event streams with dimension tables in real time. Standard SQL syntax — no custom code, no Kafka Streams topology.
Always-Fresh Lookups
Dimension data updates propagate to enriched results within seconds. No waiting for the next batch cycle.
Multi-Stream Correlation
Combine events from multiple Kafka topics, databases, and APIs into a single enriched stream.
See RisingWave in Action: Real-time Data Enrichment
See how RisingWave processes real data in real time — not a recording, not a simulation.

A DTC brand spends $2.4M/month across Google, Meta, TikTok, and email. The marketing team needs to know which touchpoint combination actually drives purchases — not the last-click attribution that gives 100% credit to the final ad.

Last-click attribution showed TikTok drove only 3% of revenue. When the team cut TikTok spend by 50%, Google and Meta conversions dropped 28% because TikTok was driving top-of-funnel awareness.
LIVEtouchpoints
user_idsession_idchannelcampaignactionrevenuets
usr_80012sess_t1atiktokspring_awarenessvideo_view02024-03-01T09:14:00.000Z
usr_80012sess_t1bgooglebrand_searchclick02024-03-05T11:22:00.000Z
usr_80012sess_t1cmetaretargeting_q1click02024-03-10T16:45:00.000Z
usr_80012sess_t1demailabandon_cart_flowclick189.992024-03-12T20:08:00.000Z
usr_73204sess_t2atiktokspring_awarenessvideo_view02024-03-02T14:30:00.000Z
usr_73204sess_t2btiktokcreator_collabclick02024-03-07T19:12:00.000Z
Streaming SQLRunning
Build per-user journey chains within 30-day conversion windows
CREATE SOURCE touchpoints WITH (
  connector = 'kafka',
  topic = 'marketing.touchpoints',
  properties.bootstrap.server = 'broker:9092'
) FORMAT PLAIN ENCODE JSON;

CREATE MATERIALIZED VIEW user_journeys AS
WITH conversions AS (
  SELECT
    user_id,
    ts AS conversion_ts,
    revenue
  FROM touchpoints
  WHERE revenue > 0
),
journeys AS (
  SELECT
    c.user_id,
    c.conversion_ts,
    c.revenue,
    t.channel,
    t.campaign,
    t.action,
    t.ts AS touch_ts,
    ROW_NUMBER() OVER (
      PARTITION BY c.user_id, c.conversion_ts
      ORDER BY t.ts
    ) AS touch_position,
    COUNT(*) OVER (
      PARTITION BY c.user_id, c.conversion_ts
    ) AS journey_length
  FROM conversions c
  JOIN touchpoints t
    ON c.user_id = t.user_id
    AND t.ts <= c.conversion_ts
    AND t.ts >= c.conversion_ts - INTERVAL '30 DAYS'
)
SELECT
  user_id,
  conversion_ts,
  revenue,
  channel,
  campaign,
  touch_position,
  journey_length,
  CASE
    WHEN journey_length = 1 THEN 1.0
    WHEN touch_position = 1 THEN 0.30
    WHEN touch_position = journey_length THEN 0.30
    ELSE 0.40 / (journey_length - 2)
  END AS position_weight
FROM journeys;
Compute channel contribution using position-weighted attribution
channel_attributionauto-updating
channellast_click_revenueattributed_revenueassist_countavg_positionroas
google892400684120142000.583.42
meta724800571440184000.652.86
tiktok72000456000312000.222.28
email71080068844086000.885.74
RisingWave computes Shapley-value attribution across all touchpoints in real time. TikTok's true contribution is 19% of revenue when measured by its assist value — the brand reverses the budget cut within 24 hours.
Why RisingWave

Give Every System Complete, Enriched Data — In Real Time

Replace batch enrichment with continuous streaming JOINs that keep every downstream system working with fresh, complete records.

Improve Model Accuracy
Feed ML models and recommendation engines with fully enriched, real-time data instead of stale batch outputs — improving predictions and personalization.
Eliminate Stale Lookups
Dimension data changes propagate to enriched results in seconds. No more waiting hours for batch ETL to refresh user profiles, product catalogs, or geo data.
Simplify Your Data Pipeline
Replace complex multi-stage batch ETL with a single streaming SQL query. Fewer moving parts, fewer failures, faster time to production.

Ready to Build Real-Time Enrichment Pipelines?

Best-in-Class Event Streaming
for Agents, Apps, and Analytics
GitHubXLinkedInSlackYouTube
Sign up for our to stay updated.