Дата-группа SQLite на 168 часов (7 дней) возвращает NULL - PullRequest
0 голосов
/ 29 октября 2019

У меня есть таблица Orders в моей базе данных SQLite. Я хочу сгруппировать данные по 168 часам (7 дням) и подсчитать до Orders за 168 часов.

Я создал «календарную таблицу» в памяти, и яПрисоединил мою таблицу Orders к этому календарному набору.

Это прекрасно работает, когда я группирую по 12, 24, 48 или даже 120 часам (5 дней). Но почему-то это не работает, когда я группирую по 168 часов (7 дней). Я получаю NULL значений вместо того, что count() должно действительно возвращать.

Следующий код sql является примером, который группирует каждые 120 часов (5 дней).

CREATE TABLE IF NOT EXISTS Orders (
    Id    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    Key   TEXT,
    Timestamp TEXT NOT NULL
);

INSERT INTO Orders (Key, Timestamp) VALUES ('k1', '2019-10-01 10:00:23');
INSERT INTO Orders (Key, Timestamp) VALUES ('k2', '2019-10-01 15:45:19');
INSERT INTO Orders (Key, Timestamp) VALUES ('k3', '2019-10-02 17:05:19');
INSERT INTO Orders (Key, Timestamp) VALUES ('k4', '2019-10-03 20:12:19');
INSERT INTO Orders (Key, Timestamp) VALUES ('k5', '2019-10-04 08:49:19');
INSERT INTO Orders (Key, Timestamp) VALUES ('k6', '2019-10-05 11:24:19');
INSERT INTO Orders (Key, Timestamp) VALUES ('k7', '2019-10-07 11:24:19');

WITH RECURSIVE dates(date1) AS (
    VALUES('2019-10-01 00:00:00')
    UNION ALL
    SELECT datetime(date1, '+120 hours')
    FROM dates
    WHERE date1 <= '2019-10-29 00:00:00'
)
SELECT date1 as __ddd, d2.* FROM dates AS d1

LEFT JOIN (
    SELECT count(Key) AS OrderKey, 
    datetime((strftime('%s', timestamp) / 432000) * 432000, 'unixepoch') as __interval 
    FROM `Orders` 
    WHERE `Timestamp` >= '2019-09-29T00:00:00.000' 
    GROUP BY __interval  LIMIT 10 
) d2 ON d1.date1 = d2.__interval

Важное примечание: Если вы хотите обновить этот код, чтобы протестировать его с 168 часами (7 днями), то вам нужно сделать следующее:

  • Изменить+120 hours до +168 hours
  • Измените 432000 (432000 == 120 часов) на 604800 (604800 == 168 часов)
    • обратите внимание, что это число происходитдважды, оба должны быть заменены

Кто-нибудь есть идеи, почему он перестает работать должным образом, когда я изменяю код sql на 168 часов?

1 Ответ

1 голос
/ 30 октября 2019

Ваша проблема в том, что при переходе на 7-дневный интервал значения в dates CTE не совпадают с интервалами, сгенерированными из вашей таблицы Orders. Вы можете исправить это, запустив dates CTE в аналогично выровненную дату:

WITH RECURSIVE dates(date1) AS (
    SELECT datetime((strftime('%s', '2019-10-01 00:00:00') / 604800) * 604800, 'unixepoch')
    UNION ALL
    SELECT datetime(date1, '+168 hours')
    FROM dates
    WHERE date1 <= '2019-10-29 00:00:00'
)

Вывод:

__ddd               OrderKey    __interval
2019-09-26 00:00:00 3           2019-09-26 00:00:00
2019-10-03 00:00:00 4           2019-10-03 00:00:00
2019-10-10 00:00:00 null        null
2019-10-17 00:00:00 null        null
2019-10-24 00:00:00 null        null
2019-10-31 00:00:00 null        null

Демонстрация на dbfiddle

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