2013-11-14 26 views
0

我想计算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操作不起作用联接表。

任何帮助是极大的赞赏:)

回答

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

这是你说的不支持的吗?

+0

感谢您的帮助。不幸的是,它不支持。该查询具有使用不等式加入的相同问题。 – beefyhalo

0

开始InfiniDB 4.0,你可以做这样的计算与窗口函数:您查询看起来像以下

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 

这将使您预期的结果

+0

感谢您花时间提交答案。 InfiniDB的窗口函数在这里肯定会很有用,但不幸的是查询不起作用:“SQL语法错误...附近'DISTINCT(account_id)...” – beefyhalo

+0

您好:请尝试使用这个查询:SELECT date_id,uniques FROM( SELECT date_id,COUNT(DISTINCT(account_id))OVER(PARTITION BY date_id RANGE INTERVAL 30 DAY PRECEDING)as Uniques FROM sessions)t1 GROUP by date_id,uniques –