SQLite: вычислить, как счетчик увеличился в текущий день и неделю - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть база данных SQLite со счетчиком и отметкой времени в unixtime, как показано ниже:

+---------+------------+
| counter | timestamp  |
+---------+------------+
|         | 1582933500 |
|    1    |            |
+---------+------------+
|    2    | 1582933800 |
+---------+------------+
|   ...   |     ...    |
+---------+------------+

Я хотел бы рассчитать, как увеличился «счетчик» в текущий день и текущую неделю.

Это возможно в запросе SQLite?

Спасибо!

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

При условии, что у вас версия SQLite> = 3.25.0, функции окна SQLite помогут вам достичь этого.

Использование функции LAG для извлечения значения из предыдущая запись - если ее нет (что будет иметь место для первой строки), предоставляется значение по умолчанию , то есть то же, что и текущая строка.

Для целей демонстрация этого кода:

SELECT counter, timestamp,
LAG (timestamp, 1, timestamp) OVER (ORDER BY counter) AS previous_timestamp,
(timestamp - LAG (timestamp, 1, timestamp) OVER (ORDER BY counter)) AS diff
FROM your_table
ORDER BY counter ASC

даст этот результат:

1   1582933500  1582933500  0
2   1582933800  1582933500  300
0 голосов
/ 29 февраля 2020

В CTE получите минимальную и максимальную временную метку для каждого дня и присоедините ее дважды к таблице:

with cte as (
  select date(timestamp, 'unixepoch', 'localtime') day,
    min(timestamp) mindate, max(timestamp) maxdate
  from tablename
  group by day
)
select c.day, t2.counter - t1.counter difference
from cte c
inner join tablename t1 on t1.timestamp = c.mindate
inner join tablename t2 on t2.timestamp = c.maxdate;

С помощью аналогичного кода получите результаты для каждой недели:

with cte as (
  select strftime('%W', date(timestamp, 'unixepoch', 'localtime')) week,
    min(timestamp) mindate, max(timestamp) maxdate
  from tablename
  group by week
)
select c.week, t2.counter - t1.counter difference
from cte c
inner join tablename t1 on t1.timestamp = c.mindate
inner join tablename t2 on t2.timestamp = c.maxdate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...