ALTER TABLE task_inputs ADD COLUMN send_id TEXT NOT NULL DEFAULT ''; ALTER TABLE lead_inputs ADD COLUMN send_id TEXT NOT NULL DEFAULT ''; UPDATE task_inputs SET send_id = 'queued-' || id; UPDATE events SET payload = json_set(payload, '$.send_id', 'queued-' || json_extract(payload, '$.id')) WHERE kind = 'user.queued'; -- The n-th delivered queue entry of a task, sender and text pairs with the n-th later user.message of the same. WITH q AS ( SELECT e.seq, e.task_id, e.actor, json_extract(e.payload, '$.text') AS text, json_extract(e.payload, '$.send_id') AS send_id, row_number() OVER (PARTITION BY e.task_id, e.actor, json_extract(e.payload, '$.text') ORDER BY e.seq) AS n FROM events AS e WHERE e.kind = 'user.queued' AND json_extract(e.payload, '$.id') NOT IN (SELECT id FROM task_inputs) AND NOT EXISTS ( SELECT 1 FROM events AS u WHERE u.kind = 'user.unqueued' AND u.task_id = e.task_id AND json_extract(u.payload, '$.id') = json_extract(e.payload, '$.id') ) ), first AS ( SELECT task_id, actor, text, min(seq) AS seq FROM q GROUP BY task_id, actor, text ), m AS ( SELECT e.seq, e.task_id, e.actor, json_extract(e.payload, '$.text') AS text, row_number() OVER (PARTITION BY e.task_id, e.actor, json_extract(e.payload, '$.text') ORDER BY e.seq) AS n FROM events AS e JOIN first AS f ON f.task_id = e.task_id AND f.actor = e.actor AND f.text = json_extract(e.payload, '$.text') AND e.seq > f.seq WHERE e.kind = 'user.message' ), pairs AS ( SELECT m.seq, q.send_id FROM m JOIN q ON q.task_id = m.task_id AND q.actor = m.actor AND q.text = m.text AND q.n = m.n AND q.seq < m.seq ) UPDATE events SET payload = json_set(payload, '$.send_id', (SELECT send_id FROM pairs WHERE pairs.seq = events.seq)) WHERE seq IN (SELECT seq FROM pairs);