Если вы делаете все это в R и извлекаете строки из базы данных 80,0000 раз в цикле ... у вас, вероятно, будут лучшие результаты, если вы сделаете все это за один раз в sqlite.
Имеется таблица скелетов, такая как:
CREATE TABLE data(id INTEGER, timestamp TEXT);
INSERT INTO data VALUES (1, '2019-07-01'), (1, '2019-06-25'), (1, '2019-06-24'),
(2, '2019-04-15'), (2, '2019-04-14');
CREATE INDEX data_idx_id_time ON data(id, timestamp DESC);
запрос типа:
SELECT id
, julianday(first_ts)
- julianday((SELECT max(d2.timestamp)
FROM data AS d2
WHERE d.id = d2.id AND d2.timestamp < d.first_ts)) AS days_difference
FROM (SELECT id, max(timestamp) as first_ts FROM data GROUP BY id) AS d
ORDER BY id;
даст вам
id days_difference
---------- ---------------
1 6.0
2 1.0
Альтернатива для современных версий sqlite (3.25 или новее) (РЕДАКТИРОВАТЬ: В тестовой базе данных с 16 миллионами строк и 80000 различных идентификаторов она работает значительно медленнее, чем приведенная выше, поэтому вы не хотите использовать ее на самом деле ):
WITH cte AS
(SELECT id, timestamp
, lead(timestamp, 1) OVER id_by_ts AS next_ts
, row_number() OVER id_by_ts AS rn
FROM data
WINDOW id_by_ts AS (PARTITION BY id ORDER BY timestamp DESC))
SELECT id, julianday(timestamp) - julianday(next_ts) AS days_difference
FROM cte
WHERE rn = 1
ORDER BY id;
(Индекс необходим для производительности для обеих версий. Вероятно, вы захотите запустить ANALYZE в таблице в какой-то момент после ее заполнения и создания ваших индексов.)