(query (:SELECT (:as (:over (:row-number) (:order-BY 'id)) 'rrid) 'id 'time-send 'data :FROM 'chat) :plists) => SELECT (row_number() OVER ( ORDER BY id)) AS rrid, id, time_send, data FROM chat SELECT row_number() over (ORDER BY id) as rrid, id, time_send, data, lag(time_send) over (ORDER BY id) as last_time_sEND FROM chat; (query (:SELECT (:as (:over (:row-number) (:order-BY 'id)) 'rrid) (:as (:over (:lag 'time-send) (:order-BY 'id)) 'last-time-send) 'id 'time-send 'data :FROM 'chat) :plists) ' WITH cte as ( SELECT row_number() over (ORDER BY id) as rrid, id, to_char(time_send, 'YYYY-MM-DD HH24:MI:SS'), data, age(time_send, lag(time_send) over (ORDER BY id)) as interval FROM chat ) SELECT id, rrid, interval, EXTRACT('epoch' FROM interval) as seconds FROM cte WHERE interval IS NOT NULL; TRUNCATE instead of DELETE FROM TABLE AFTER DONE TOOLS: Backup functions: ~/Develop/Lisp/mine/shopping/tools/database-FUNCTION ANY/ALL/SOME/EVERY SELECT to_jsonb(*) FROM express; --> Won't work SELECT to_jsonb(express) FROM express; --> Work, also array_agg(express), jsonb_agg(express) to_json => Return a row for EACH row array_agg, jsonb_agg => Return ONLY ONE row, concat each row into ONE! --JavaScript date to Postgres insert into times (time) values (to_timestamp(${Date.now()} / 1000.0)) -- MULTIPLE variables SELECT col1, col2 INTO a, b FROM tbl WHERE...;