SQL分群語法 列出活躍使用者 Leetcode #1141

更新於 發佈於 閱讀時間約 6 分鐘

題目敘述

題目會給我們一張Activity資料表,裡面分別有user_id、 session_id、activity_date 、activity_type等欄位。

要求我們,以日期做分群列出過去30天,對於每一天,相對應的活躍使用者的數目。

活躍使用者的定義為2019-07-27包含這天,往前三十天的區間內,至少有過一次活動紀錄的使用者。


輸出的順序不拘


Table: Activity

+---------------+---------+
| Column Name | Type |
+---------------+---------+
| user_id | int |
| session_id | int |
| activity_date | date |
| activity_type | enum |
+---------------+---------+
This table may have duplicate rows.
The activity_type column is an ENUM (category) of type ('open_session', 'end_session', 'scroll_down', 'send_message').
The table shows the user activities for a social media website.
Note that each session belongs to exactly one user.

詳細的題目可在這裡看到


測試範例

Example 1:

Input: 
Activity table:
+---------+------------+---------------+---------------+
| user_id | session_id | activity_date | activity_type |
+---------+------------+---------------+---------------+
| 1 | 1 | 2019-07-20 | open_session |
| 1 | 1 | 2019-07-20 | scroll_down |
| 1 | 1 | 2019-07-20 | end_session |
| 2 | 4 | 2019-07-20 | open_session |
| 2 | 4 | 2019-07-21 | send_message |
| 2 | 4 | 2019-07-21 | end_session |
| 3 | 2 | 2019-07-21 | open_session |
| 3 | 2 | 2019-07-21 | send_message |
| 3 | 2 | 2019-07-21 | end_session |
| 4 | 3 | 2019-06-25 | open_session |
| 4 | 3 | 2019-06-25 | end_session |
+---------+------------+---------------+---------------+
Output:
+------------+--------------+
| day | active_users |
+------------+--------------+
| 2019-07-20 | 2 |
| 2019-07-21 | 2 |
+------------+--------------+
Explanation: Note that we do not care about days with zero active users.
七月20日,user 1 和 user 2 為活躍使用者
七月21日​,user 2 和 user 3 為活躍使用者

約束條件

活躍使用者的定義為2019-07-27包含這天,往前三十天的區間內,至少有過一次活動紀錄的使用者。


演算法

有點變化的進階題,在基本的查詢語法上,加上分群GROUP BY語法來對搜尋結果做分類。

如果是第一次接觸SQL的同學,請到這邊學習基本的SQL 語法

SELECT ...欄位 FROM ...表格 WHERE ...條件

GROUP BY ...分群的依據欄位


實作上有個小細節要留意,因為有包含尾巴2019-07-27這天,所以往前數30天,區間的第一天是2019-06-28。


程式碼

SELECT  activity_date AS day, COUNT(DISTINCT user_id) AS active_users 
FROM Activity
# Filter those activities on latest 30 days
WHERE activity_date BETWEEN "2019-06-28" AND "2019-07-27"
GROUP BY activity_date;

關鍵知識點

掌握SELECT ...欄位 FROM ...表格 WHERE ...條件

GROUP BY ...分群的語法即可。


Reference:

[1] MySQL with GROUP BY ... syntax - User Activity for the Past 30 Days I - LeetCode

avatar-img
91會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給我們一張World資料表,裡面分別有name、 continent、area、population 、gdp等欄位,其中name 是主鍵Primary Key。 要求我們列出所有大型國家,大型國家的定義是 人口大於等於兩千五百萬人 或者 土地面積大於等於三百萬平方公里。 輸出順
題目敘述 題目會給我們一張Cinema資料表,裡面分別有id、movie、description, rating 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID為奇數,而且不無聊的電影,印出時依照電影rating評分從高到低降序排列。 Table: Cinema
題目敘述 題目會給我們一張Customer資料表,裡面分別有id、name、referee_id 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID referee_id不等於2的顧客,印出順序不拘。
題目會給我們一張Products資料表,裡面分別有product_id、low_fats、recyclable等欄位,其中product_id 是主鍵Primary Key。 要求我們列出所有的可回收 且 低脂產品的product_id,順序不拘。
題目敘述 題目會給我們一張World資料表,裡面分別有name、 continent、area、population 、gdp等欄位,其中name 是主鍵Primary Key。 要求我們列出所有大型國家,大型國家的定義是 人口大於等於兩千五百萬人 或者 土地面積大於等於三百萬平方公里。 輸出順
題目敘述 題目會給我們一張Cinema資料表,裡面分別有id、movie、description, rating 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID為奇數,而且不無聊的電影,印出時依照電影rating評分從高到低降序排列。 Table: Cinema
題目敘述 題目會給我們一張Customer資料表,裡面分別有id、name、referee_id 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID referee_id不等於2的顧客,印出順序不拘。
題目會給我們一張Products資料表,裡面分別有product_id、low_fats、recyclable等欄位,其中product_id 是主鍵Primary Key。 要求我們列出所有的可回收 且 低脂產品的product_id,順序不拘。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
自 2019-07-27 開始,往前推 30 天 ,計算每天的活躍用戶數。用戶在某天如果至少有一次活動記錄,則被認為在該天是活躍的,不用管答案的排序。
Day9-11 這幾天如火如荼地學寫資料庫,從最一開始的SELECT單一欄位數值 SELECT eyes FROM body (???)
Thumbnail
※ GROUP BY 用於將數據表中的數據按照一個或多個列進行分組。例如在處理一個表格的資料時,可以指定欄位,一個或是多個,然後把將其視為ID進行分組處理。 ※ 語法 SELECT column1, column2, ..., aggregate_function(column) FROM
Thumbnail
本篇週報記錄了數據分析師最近一週的重要工作內容,包括種族與性別分析、Amazon市場分析、購買人群統計資訊及 SEO 品牌字分組等等。透過以上議題的分析與執行過程,不僅能瞭解工作內容,也能學到數據分析的實戰議題,有助於減少行銷和數據分析方面的學習彎路。
Thumbnail
這個主題其實是LINE社群網友詢問的問題。 網友:請問像這樣的排班表,我要怎麼樣做樞紐或其他函數,來快速查找,某個人名出現在星期幾的哪些時段? 原PO還有附上一個檔案,畫面如下⬇️ 就是要把這個內容快速找到,某人的班別是在哪星期的哪個時段(好饒舌) 根據網友的需求,初步製作了一個簡
如何在SQL實踐中EXCEL 常用功能 篩選 和 擷取文字串?需要熟練地使用分組(GROUP BY) 與 排序 (ORDER BY) 以及SUBSTRING_INDEX函數!
Thumbnail
在職場上,我們經常需要舉辦會議來討論工作事項或進行決策。會議結束後,我們需要統計出席資訊,以便了解會議的參與狀況。傳統的統計出席資訊的方法是人工逐行檢查會議記錄,這不僅耗時耗力,而且容易出錯。 今天,我將介紹一個使用 Excel 快速統計出席資訊的技巧,那就是使用 COUNTIF 函數。
Thumbnail
日前在LINE社群,有網友提出一個問題,要把資料進行分析,用日期來計算出將對應的資料。 原始資料,密密麻麻的數據,都看不清楚了 放大一點點 要把這些資料不同『料號』的各種『狀態』依據『日期』進行分析。 有興趣可以下載試著挑戰看看:檔案下載 作法有很多種,當然也可以用函數處
Thumbnail
看文章教學之前,可以先下載檔案來試著自己做看看哦!!! 檔案下載 有網友提問,如何將所有的平日加班與假日加班時數合計到K欄,假日加班為了註明星期幾加班,前面分別會加上六、日當作前贅詞。 只不過是加總而已,讓我直接SUM看看好了!!! 答案好像怪怪的,怎麼只有平日的數據加總而已
Thumbnail
在職場上,我們常常需要規劃和追蹤活動的進度。為了確保活動能夠如期順利完成,我們需要掌握活動的開始日期、結束日期以及每個階段的截止日期。你是否曾經遇到以下情況?要準備重要的會議,但不知道距離會議還有多少天?要舉辦年度活動,但不知道距離活動還有多少天?要管理專案進度,但不知天數掌控?
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
自 2019-07-27 開始,往前推 30 天 ,計算每天的活躍用戶數。用戶在某天如果至少有一次活動記錄,則被認為在該天是活躍的,不用管答案的排序。
Day9-11 這幾天如火如荼地學寫資料庫,從最一開始的SELECT單一欄位數值 SELECT eyes FROM body (???)
Thumbnail
※ GROUP BY 用於將數據表中的數據按照一個或多個列進行分組。例如在處理一個表格的資料時,可以指定欄位,一個或是多個,然後把將其視為ID進行分組處理。 ※ 語法 SELECT column1, column2, ..., aggregate_function(column) FROM
Thumbnail
本篇週報記錄了數據分析師最近一週的重要工作內容,包括種族與性別分析、Amazon市場分析、購買人群統計資訊及 SEO 品牌字分組等等。透過以上議題的分析與執行過程,不僅能瞭解工作內容,也能學到數據分析的實戰議題,有助於減少行銷和數據分析方面的學習彎路。
Thumbnail
這個主題其實是LINE社群網友詢問的問題。 網友:請問像這樣的排班表,我要怎麼樣做樞紐或其他函數,來快速查找,某個人名出現在星期幾的哪些時段? 原PO還有附上一個檔案,畫面如下⬇️ 就是要把這個內容快速找到,某人的班別是在哪星期的哪個時段(好饒舌) 根據網友的需求,初步製作了一個簡
如何在SQL實踐中EXCEL 常用功能 篩選 和 擷取文字串?需要熟練地使用分組(GROUP BY) 與 排序 (ORDER BY) 以及SUBSTRING_INDEX函數!
Thumbnail
在職場上,我們經常需要舉辦會議來討論工作事項或進行決策。會議結束後,我們需要統計出席資訊,以便了解會議的參與狀況。傳統的統計出席資訊的方法是人工逐行檢查會議記錄,這不僅耗時耗力,而且容易出錯。 今天,我將介紹一個使用 Excel 快速統計出席資訊的技巧,那就是使用 COUNTIF 函數。
Thumbnail
日前在LINE社群,有網友提出一個問題,要把資料進行分析,用日期來計算出將對應的資料。 原始資料,密密麻麻的數據,都看不清楚了 放大一點點 要把這些資料不同『料號』的各種『狀態』依據『日期』進行分析。 有興趣可以下載試著挑戰看看:檔案下載 作法有很多種,當然也可以用函數處
Thumbnail
看文章教學之前,可以先下載檔案來試著自己做看看哦!!! 檔案下載 有網友提問,如何將所有的平日加班與假日加班時數合計到K欄,假日加班為了註明星期幾加班,前面分別會加上六、日當作前贅詞。 只不過是加總而已,讓我直接SUM看看好了!!! 答案好像怪怪的,怎麼只有平日的數據加總而已
Thumbnail
在職場上,我們常常需要規劃和追蹤活動的進度。為了確保活動能夠如期順利完成,我們需要掌握活動的開始日期、結束日期以及每個階段的截止日期。你是否曾經遇到以下情況?要準備重要的會議,但不知道距離會議還有多少天?要舉辦年度活動,但不知道距離活動還有多少天?要管理專案進度,但不知天數掌控?