Найдите общее время, затраченное каждым `id` в течение 1 часа - PullRequest
0 голосов
/ 02 августа 2020

Как узнать общее время, затраченное каждым id.

  • Должно быть одно действие в течение часа (после начала одного действия),
  • и если есть какие-либо действия до истечения 1 часа времени, учитывайте это время в предыдущем слоте, рассчитайте разницу во времени.
  • если 1 час уже прошел, теперь проверьте, есть ли какие-либо другие действия в течение 1 часа

Пример данных:

create table test (
  id integer not null,
  ts datetime not null
);

insert into test values (1, '2012-01-01 08:00');
insert into test values (1, '2012-01-01 08:01');
insert into test values (1, '2012-01-01 08:06');
insert into test values (1, '2012-01-01 08:30');
insert into test values (1, '2012-01-01 09:35');
insert into test values (1, '2012-01-02 16:10');
insert into test values (1, '2012-01-02 16:20');
insert into test values (1, '2012-01-03 06:40');
insert into test values (1, '2012-01-03 06:41');
insert into test values (2, '2012-01-01 08:30');
insert into test values (2, '2012-01-01 09:26');
insert into test values (2, '2012-01-01 10:25');

Выходной столбец будет:

insert into test values (1, '2012-01-01 08:00');
insert into test values (1, '2012-01-01 08:01');
insert into test values (1, '2012-01-01 08:06');
insert into test values (1, '2012-01-01 08:30');

Здесь различия точно такие: 00: 30: 00

, и есть запись, которая, но это через 1 час, поэтому мы не добавляли это действие в предыдущий слот, и в течение 1 часа с этого времени нет активности, поэтому мы не рассмотрим это действие

insert into test values (1, '2012-01-01 09:35');`

Теперь это выполняется для: 00: 10: 00

insert into test values (1, '2012-01-02 16:10');
insert into test values (1, '2012-01-02 16:20');

Точно так же это выполняется для 00: 01: 00

insert into test values (1, '2012-01-03 06:40');
insert into test values (1, '2012-01-03 06:41');

Таким образом, общее время для id=1 будет 00:41:00.

id | Time duration (hh:mm:ss)
 1 | 00:41:00
 2 | 01:55:00

Я не мог придумать, как с Если вы решите эту проблему, любое возможное начало будет оценено. Спасибо!

1 Ответ

3 голосов
/ 02 августа 2020

Твоим правилам сложно следовать, но я думаю, что понимаю их. Подсчитайте промежуток между двумя строками для одного и того же идентификатора, если второй меньше чем через час после первого. Затем агрегируйте по идентификатору.

Итак:

select id, sum(datediff(minute, ts, next_ts)) as duration_minutes
from (select t.*,
             lead(ts) over (partition by id order by ts) as next_ts
      from test t
     ) t
where datediff(minute, ts, next_ts) < 60
group by id;

Здесь - скрипт db <>.

Я не хочу преобразовывать продолжительность до значения времени, потому что оно ограничено 24 часами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...