2017-03-17 30 views
0

我有2個表,用戶和事件:MYSQL:一月份擁有最多新用戶的國家?

**Users:** 
usersid 
age 
geo_country 
gender 

**events:** 
ts 
usersid 
event 
videoid 

Ts是時間戳字段。而可能的事件是「start_video」,「browse_catalog」,「exit_video」

我想找出哪個國家有最新用戶在一月份。

我的代碼如下:

SELECT DISTINCT (u.geo_country), COUNT(e.userid) As Users_Ids 
    FROM (SELECT userid, DATE(MIN(ts)) AS first_time 
      FROM events 
      WHERE ts BETWEEN '2017-01-01 00:00:00' and '2017-01-31 24:00:00' 
      GROUP BY userid) AS e 
    LEFT JOIN users u ON u.userid= e.userid 
    GROUP BY first_time 
    ORDER BY COUNT(e.userid) DESC; 

由於我沒有會議場,是我的子查詢沒事在2017年一月提供新用戶?

任何幫助將不勝感激。

感謝,

克勞迪婭

+0

不完全是。像現在查詢將選擇在一月你需要選擇'分(TS)'什麼有什麼事件的所有用戶,而不'between'選擇第一次登錄的所有用戶(或'分鐘(TS)爲FIRST_TIME其中TS <「2017-01 -31 24:00:00'')。只有然後檢查'first_time between ...' –

回答

0

我認爲您發佈的查詢略有不正確。

理論上,GROUP BY應該描述如何爲聚合函數分組數據。在主查詢,要通過國家計數的用戶,所以不是由FIRST_TIME分組,聚集COUNT應該GROUP BY去u.geo_country,也作爲一個結果,DISTINCT geo_country上的不再需要。

GROUP BY first_time也會提供錯誤的答案,因爲它提供了不是由唯一國家記錄的每個唯一first_time的用戶數量的聚合。

正確的查詢應該是:

SELECT u.geo_country, 
     COUNT(e.userid) As Users_Ids 
FROM (SELECT userid, DATE(MIN(ts)) AS first_time 
     FROM events 
     GROUP BY userid 
     HAVING first_time BETWEEN '2017-01-01 00:00:00' and '2017-01-31 24:00:00') 
AS e 
LEFT JOIN users u ON u.userid= e.userid 
GROUP BY u.geo_country 
ORDER BY Users_Ids DESC; 
+0

感謝這個提示泰語! – Claudia

+0

只是有一個簡單的問題:如果問題詢問的用戶數最多的國家,爲什麼按Users_Ids排序? – Claudia

+0

Users_Ids是聚合函數結果的別名,通過它的排序是一樣的,你使用COUNT排序。此外,Order By子句是在計劃查詢和檢索數據集之後運行的子句,它不會影響查詢結果。 –

相關問題