我有这张桌子:
id | datetime | ROW_NUMBER
1 2018-04-09 06:27:00 11 2018-04-09 14:15:00 21 2018-04-09 15:25:00 31 2018-04-09 15:35:00 41 2018-04-09 15:51:…
我会使用递归查询:
WITH RECURSIVE tmp AS ( SELECT id, datetime, row_number, 0 AS counting, datetime AS last_start FROM mytable WHERE row_number = 1 UNION ALL SELECT t1.id, t1.datetime, t1.row_number, CASE WHEN lateral_1.counting THEN 1 ELSE 0 END AS counting, CASE WHEN lateral_1.counting THEN tmp.last_start ELSE t1.datetime END AS last_start FROM mytable AS t1 INNER JOIN tmp ON (t1.id = tmp.id AND t1.row_number - 1 = tmp.row_number), LATERAL (SELECT (t1.datetime - tmp.last_start) < '1h 30m'::interval AS counting) AS lateral_1 ) SELECT id, datetime, counting FROM tmp ORDER BY id, datetime;