2013-11-14 27 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 –