SQL
@Igor pure-SQL .
:
3 : [1,2], [3,4], [5]
, ORDER BY min(id):
SELECT array_agg(id) AS ids
FROM (
SELECT id
,user_id
,row_number() OVER (ORDER BY id) -
row_number() OVER (PARTITION BY user_id ORDER BY id) AS grp
FROM messages
ORDER BY id) t
GROUP BY grp, user_id
ORDER BY min(id);
SQL Fiddle.
. :
PL/pgSQL
PostgreSQL - , , .
SQL , . , , , , plpgsql , ORDER BY:
CREATE OR REPLACE FUNCTION f_msg_groups()
RETURNS TABLE (ids int[]) AS
$func$
DECLARE
_id int;
_uid int;
_id0 int;
_uid0 int;
BEGIN
FOR _id, _uid IN
SELECT id, user_id FROM messages ORDER BY id
LOOP
IF _uid <> _uid0 THEN
RETURN QUERY VALUES (ids);
ids := ARRAY[_id];
ELSE
ids := ids || _id;
END IF;
_id0 := _id;
_uid0 := _uid;
END LOOP;
RETURN QUERY VALUES (ids);
END
$func$ LANGUAGE plpgsql;
:
SELECT * FROM f_msg_groups();
EXPLAIN ANALYZE 60k ( , , ):
SQL:
: 1009,549
Pl/PGSQL:
: 336,971
: