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

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
SQL 深海探險錄 #2: 海語之歌SQL 深海探險錄 #2: 海語之歌
Thumbnail
avatar
KH Huang
2023-10-19
SQL 深海探險錄 #1: 海圖啟動SQL 深海探險錄 #1: 海圖啟動
Thumbnail
avatar
KH Huang
2023-10-11
SQL | 語法基礎篇 (2)SQL語法:JOIN 與交易
Thumbnail
avatar
Jeremy Ho
2023-10-04
SQL 程式札記 : 基本語法 CREATE、INSERT、SELECT、UPDATE、DELETE 介紹SQL 是一種專門用來和資料庫進行溝通的程式語言,它讓我們能夠創建資料表、新增、查詢、修改和刪除資料庫中的資料,本文將介紹基本的創建、新增、查詢、修改和刪除的 SQL 語法。
Thumbnail
avatar
梧笙
2023-09-11
[SQL] 如何在SQL Server中建立暫存表在SQL Server中,暫存表(Temporary Table)是一種在連線會話期間存在的臨時表格,它可以用來暫存中間結果或臨時資料。本文將介紹如何使用T-SQL語法在SQL Server中建立暫存表。
Thumbnail
avatar
Pochi
2023-08-20
[SQL] 基本操作:SELECT、UPDATE、INSERT 和 DELETE 實作教學在資料庫管理中,SQL(Structured Query Language)是一種強大的工具,用於處理資料庫中的資料。本篇教學將介紹 SQL 中的基本操作,包括 SELECT、UPDATE、INSERT 和 DELETE,讓您能夠有效地查詢、更新、插入和刪除資料。
Thumbnail
avatar
Pochi
2023-08-11
SQL 挑戰,一個讓你彎道超車的關鍵我帶著敬畏的心去請教直屬主管,看有沒有讓自己進步的好辦法。結果直屬主管跟我說了這句話,霸氣外露的一句話讓我印象極為深刻,請教結束後主管還出了一門作業「SQL 轉置」,並特別交代我說:「你只要把這個技術學會就會變強」。
Thumbnail
avatar
Warren Lo
2023-05-10
[SQL Server] A connection was successfully established with the server, but then an error occurred…今天寫程式連結資料庫,遇見這樣的錯誤 環境 .NET Core 6 / VS 2022 解決方法:DB連結字串 ConnectionString 需要額外加上 TrustServerCertificate=true。不然會出現錯誤 以 appsettings.json 設定檔為例
avatar
兩千MIS
2021-11-29
SQL Injection 攻擊與防禦假如你開發了一個網站,有user登入的功能,駭客故意輸入SQL語法來破壞原本的SQL結構,這就是SQL注入攻擊。
Thumbnail
avatar
Vic Lin
2020-10-23