2013-07-02 51 views
-1

這裏有一個問題,那就是我需要計算每個日期的30天內的unque用戶總數。我的意思是今天它是今天範圍內的唯一總和 - 30天,昨天是昨天 - 30天等等。表結構是:30天內的唯一身份用戶總數

date  uid visits 
27-06-2013 11  40 
27-06-2013 14  40 
26-06-2013 13  45 
25-06-2013 11  20 
24-06-2013 12  40 

它繼續像這樣。我需要的是每天的總和。

+0

爲什麼不使用DATE數據類型的日期?一旦你解決了這個問題,請準備一個sqlfiddle並向我們展示期望的結果集的實際外觀。 – Strawberry

+0

@Barmar檢查尾部求和查詢。但我不明白第一個答案,第二個只是選擇3天。所以在這裏我需要做這個30天? –

+0

是的,對不起,這些答案在這麼長時間內並不是很好。使用Kickstart的答案。 – Barmar

回答

0

東西那麼簡單,下面應該很好地工作:

SELECT 
    `date`, 
    COUNT(DISTINCT `uid`) as `unique_visits` 
FROM 
    `foo` 
WHERE 
    `date` >= DATE_SUB(NOW(), INTERVAL 30 DAY) 
GROUP BY 
    `date` 

SQLFiddle DEMO

+0

但這隻會給計數。不是SUM –

+0

登錄日期很可能是一個時間戳,因此您需要將其轉換。 –

+0

@AlwinAugustin你想** **獨一無二**數一天,對吧? – h2ooooooo

0

假設我已經正確地讀出你的問題,你日期字段的數據類型爲日期,然後這樣的可能: -

SELECT Sub1.EndDate, COUNT(DISTINCT a.uid) 
FROM SomeTable a 
INNER JOIN 
(
    SELECT DISTINCT date AS EndDate, DATE_SUB(date, INTERVAL 30 DAY) AS StartDate 
    FROM SomeTable 
) Sub1 
ON a.date BETWEEN Sub1.StartDate AND Sub1.EndDate 

這是使用一個子選項來獲取30天的每個範圍,然後加入到表中以獲得該表中的所有記錄r ange和做一個不同的計數找到所有不同的用戶

+0

#1054 - '字段列表'中的未知列'Sub1.date' –

+0

現在就試試吧(我把日期字段設置爲EndDate,但忘記在頂部選擇中將其更改) – Kickstart

0
Consider this example. It provides a rolling sum on values within 3 points of the current value 

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT x.i, SUM(y.i) FROM ints x JOIN ints y ON y.i BETWEEN x.i-3 AND x.i GROUP BY x.i; 
+---+----------+ 
| i | SUM(y.i) | 
+---+----------+ 
| 0 |  0 | 
| 1 |  1 | 
| 2 |  3 | 
| 3 |  6 | 
| 4 |  10 | 
| 5 |  14 | 
| 6 |  18 | 
| 7 |  22 | 
| 8 |  26 | 
| 9 |  30 | 
+---+----------+