Агрегировать по скользящему окну только с равными соединениями

Я хотел бы рассчитать общее количество уникальных аккаунтов за 30 дней. Кажется, что движок, который я использую в MySQL (InfiniDB), поддерживает объединение таблиц только на условиях равенства.

Моя таблица выглядит так:

sessions (date_id, account_id) =
{ '2013-07-07', 5
  '2013-07-07', 5
  '2013-07-07', 1
  '2013-07-08', 3
  '2013-07-09', 3
}

Мой текущий запрос выглядит так:

SELECT
  date_id, (
    SELECT COUNT(DISTINCT account_id)
    FROM sessions t2
    WHERE t2.date_id BETWEEN DATE_SUB(t1.date_id, INTERVAL 30 DAY) AND t1.date_id
  ) cnt
FROM sessions t1
GROUP BY date_id

Поддерживаются только равные соединения, поэтому BETWEEN Оператор не работает, чтобы присоединиться к таблицам.

Любая помощь очень ценится:)

2 ответа

Начиная InfiniDB 4.0, вы можете выполнять такие вычисления с помощью функции Windowing: ваш запрос выглядит следующим образом

SELECT date_id, COUNT(act_id)  AS Uniques
FROM ( SELECT date_id, 
              DISTINCT(account_id) OVER (PARTITION BY date_id RANGE INTERVAL 30 DAY PRECEDING) act_id
       FROM sessions ) t1
GROUP BY date_id

Это даст вам ожидаемые результаты

Я не особенно знаком с InfiniDB, но я думаю, что будет чище:

SELECT
  t1.date_id,
  COUNT(DISTINCT t2.account_id) AS Uniques
FROM sessions t1
INNER JOIN sessions t2 
  ON t2.date_id BETWEEN DATE_SUB(t1.date_id, INTERVAL 30 DAY) AND t1.date_id
GROUP BY t1.date_id;

Результат:

DATE_ID                   UNIQUES
July, 07 2013 00:00:00+0000   2
July, 08 2013 00:00:00+0000   3
July, 09 2013 00:00:00+0000   3

sqlfiddle demo

Вы сказали, что это не поддерживается?

Другие вопросы по тегам