仅在等连接的滑动窗口上聚合

时间:2013-11-14 18:22:16

标签: mysql sql join infinidb

我想计算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

仅支持equi-joins,因此BETWEEN运算符无法连接表。

非常感谢任何帮助:)

2 个答案:

答案 0 :(得分:0)

我对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

这是你所说的不支持吗?

答案 1 :(得分:0)

启动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

这会给你预期的结果