[英]Aggregate over a sliding window with only equi-joins
我想计算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
运算符不适用于联接表。
任何帮助是极大的赞赏 :)
我对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
这是您所说的不受支持吗?
从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
这将给您预期的结果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.