Я изменил запрос в соответствии с новой информацией.
Во-первых, мы ранжируем наши записи по «creationDateTime» в разделах, созданных userId и deviceId. Мы также группируем записи по пользователю, устройству и дню из creatioDateTime. - CTE ol_dt
Затем мы создаем линии между точками, соединяя их внутри групп и по нашему ранжированию (поэтому мы соединяем нашу точку со следующим моментом времени от того же пользователя и устройства в конкретный день) - линии CTE
Последнее, что мы объединяем все строки от точки к точке, чтобы одна (много) линейная строка все еще в группах.
with ol_dt as (SELECT row_number() over (partition by "userId", "deviceId"
order by "creationDateTime") rnk,
rank() over (order by "userId", "deviceId",
date("creationDateTime")) rnk2,
o."userId",
o."deviceId",
date(o."creationDateTime") as day,
o.shape
FROM olocations o),
lines as (select ol_dt."userId", ol_dt."deviceId", ol_dt.day,
st_makeline(ol_dt.shape, ol_dt2.shape) as geom
from ol_dt, ol_dt ol_dt2
where ol_dt.rnk2=ol_dt.rnk2
and ol_dt.rnk+1=ol_dt2.rnk)
select "userId", "deviceId", day, st_union(geom) geom
from lines
group by "userId", "deviceId", day
Для больших наборов данных (гончих тысяч или миллионов или более записей), когда вы хотите сделать это для всего набора данных одновременно.
Create temp table ol_dt as
SELECT row_number() over (partition by "userId", "deviceId"
order by "creationDateTime") rnk,
rank() over (order by "userId", "deviceId", date("creationDateTime")) rnk2,
o."userId",
o."deviceId",
date(o."creationDateTime") as day,
o.shape
FROM olocations o;
create index on ol_dt using btree (rnk, rnk2);
create index on ol_dt using gist(shape);
Затем создайте таблицу со вторым CTE
create temp table lines as
select ol_dt."userId", ol_dt."deviceId", ol_dt.day,
st_makeline(ol_dt.shape, ol_dt2.shape) as geom
from ol_dt, ol_dt ol_dt2
where ol_dt.rnk2=ol_dt.rnk2
and ol_dt.rnk+1=ol_dt2.rnk;
И, наконец,
select "userId", "deviceId", day, st_union(geom) geom
from lines
group by "userId", "deviceId", day