[英]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.