Счетчик циклов SQL во временных рядах - PullRequest
1 голос
/ 20 июня 2019

У меня есть таблица компаний на SQLite и сколько статей о каждой компании пишется каждый день в течение 10 лет (и около 3000 компаний).Я хочу сделать «скользящий» подсчет, при котором для каждой компании я подсчитываю общее количество новостных статей в трехдневном окне, при условии наличия положительного количества новостных статей.Например, начиная с 1-го дня, если количество статей равно 0, пропустите и перейдите ко 2-му дню и т. Д., Пока мы не достигнем дня (скажем, 4-го дня), где есть 1 статья, а затем подсчитаем общее количество статей впоследующие 3 дня (итак дни 4,5,6).После этого я перехожу к 7-му дню и продолжаю сканирование, пока не найду первый день, в котором есть новостная статья, и повторю эту трехдневную сумму, и продолжу сканирование после этого и т. Д. Я буду повторять это для каждой компании.

Я думал о скользящей сумме, используя оконные функции, но при 3000 компаниях, умножая 365 * 10 дней на скользящую сумму данных, в вычислительном отношении это может занять слишком много времени, и, кроме того, мне не нужно вычислять суммы в те дни, когда япропустить (то есть либо дни с 0, либо дни, которые не являются первыми днями в 3-дневном интервале).

Например, временной ряд для каждой компании может быть (День №: Количество статей)

Day 1:0
Day 2:0
Day 3:0
Day 4:1
Day 5:3
Day 6:2
Day 7:0
Day 8:0
Day 9:20
Day 10:2
Day 11:0

Тогда результат будет

Day 4:6 (1 from Day 4, 3 from Day 5, and 2 from Day 6)
Day 9:22 (20 from day 9, 2 from day 10, 0 from day 11).

1 Ответ

1 голос
/ 20 июня 2019

В более поздних версиях SQLite вы должны использовать row_number():

select company, min(date), max(date), sum(num_articles)
from (select t.*,
             row_number() over (partition by company order by date) as seqnum
      from t
      where num_articles > 0
     ) t
group by company, floor((seqnum - 1) / 3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...