I have a PostgreSQL table constructed as
device_id | point | dt_edit
----------+-----------+----------
100 | geometry | timestamp
101 | geometry | timestamp
100 | geometry | timestamp
102 | geometry | timestamp
102 | geometry | timestamp
101 | geometry | timestamp
I need to select the last 2 records ordered by dt_edit from unique device_id. This query works very slow, on 1 billion records - 500 seconds:
SELECT dt.device_id,
dt.point,
dt.dt_edit
FROM ( SELECT gps_data.device_id,
gps_data.point,
gps_data.dt_edit,
rank() OVER (PARTITION BY gps_data.device_id
ORDER BY gps_data.dt_edit DESC) AS rank
FROM gps_data) dt
WHERE dt.rank <= 2
Any ideas?