互聯網SQL面試題:用戶會話時長分析

這是一個基于用戶點擊信息進行會話時長分析的案例,常見于互聯網 App 使用分析。

問題描述

用戶的訪問記錄存儲在 user_access 表中,包含用戶編號(user_id)以及訪問時間(access_time)等信息。以下是一個示例數據:

-- 創建示例表
CREATE TABLE user_access(user_id bigint, access_time timestamp);-- 生成示例數據
INSERT INTO user_access VALUES
(1, '2025-04-30 07:00:00'),
(2, '2025-04-30 07:05:00'),
(2, '2025-04-30 07:10:00'),
(1, '2025-04-30 07:15:00'),
(1, '2025-04-30 07:20:00'),
(1, '2025-04-30 08:00:00'),
(3, '2025-04-30 08:00:00'),
(1, '2025-04-30 08:10:00');

對于同一個用戶,如果前后兩次操作時間間隔超過 30 分鐘,則認為它們屬于不同的會話。要求分析每個用戶每次會話的開始時間和結束時間,輸出結果如下:

在這里插入圖片描述

以用戶 1 為例,他有兩次會話,第一次會話從 7 點開始到 7 點 20 分結束(持續 20 分鐘),第二次會話從 8 點開始到 8 點 10 分結束(持續 10 分鐘)。

問題解析

基于上面的描述,我們首先需要分析用戶每次點擊的時間和上一次時間是否間隔超過 30 分鐘,超過了表示新會話開始,否則仍然屬于上一次會話。為此,我們需要使用一個窗口函數 lag,它可以返回上一條數據的信息:

SELECT user_id, access_time,lag(access_time) OVER (PARTITION BY user_id ORDER BY access_time) AS pre_access_time, -- 上次點擊時間CASE WHEN access_time  - INTERVAL '30' MINUTE <= lag(access_time) OVER (PARTITION BY user_id ORDER BY access_time) THEN 0ELSE 1END AS new_session -- 基于每次點擊和上次點擊時間間隔判斷是否新的會話
FROM user_access;user_id|access_time            |pre_access_time        |new_session|
-------+-----------------------+-----------------------+-----------+1|2025-04-30 07:00:00.000|                       |          1|1|2025-04-30 07:15:00.000|2025-04-30 07:00:00.000|          0|1|2025-04-30 07:20:00.000|2025-04-30 07:15:00.000|          0|1|2025-04-30 08:00:00.000|2025-04-30 07:20:00.000|          1|1|2025-04-30 08:10:00.000|2025-04-30 08:00:00.000|          0|2|2025-04-30 07:05:00.000|                       |          1|2|2025-04-30 07:10:00.000|2025-04-30 07:05:00.000|          0|3|2025-04-30 08:00:00.000|                       |          1|

其中,lag 函數分析了每個用戶(PARTITION BY user_id)每次點擊對應的上一次點擊時間(ORDER BY access_time);CASE 表達式基于時間間隔判斷是否新的會話開始。

考慮到一個用戶可能存在多次會話,我們需要把它們進行編號。基于上面的查詢結果,每次新會話開始對應的 new_session 字段都等于 1,其他都等于 0,可以基于這個字段求和生成會話編號:

WITH user_access_session_flag AS ( SELECT user_id, access_time,CASE WHEN access_time  - INTERVAL '30' MINUTE <= lag(access_time) OVER (PARTITION BY user_id ORDER BY access_time) THEN 0ELSE 1END AS new_session -- 基于每次點擊和上次點擊時間間隔判斷是否新的會話FROM user_access
)
SELECT user_id, access_time,sum(new_session) OVER (PARTITION BY user_id ORDER BY access_time) AS session_num -- 基于new_session標識生成每次會話的編號
FROM user_access_session_flag;user_id|access_time            |session_num|
-------+-----------------------+-----------+1|2025-04-30 07:00:00.000|          1|1|2025-04-30 07:15:00.000|          1|1|2025-04-30 07:20:00.000|          1|1|2025-04-30 08:00:00.000|          2|1|2025-04-30 08:10:00.000|          2|2|2025-04-30 07:05:00.000|          1|2|2025-04-30 07:10:00.000|          1|3|2025-04-30 08:00:00.000|          1|

其中,WITH 用于定義通用表表達式,我們可以簡單把它理解為一個臨時表(user_access_session_flag)。在這里主要是將查詢語句模塊化,便于我們閱讀,否則要使用子查詢。

此時,我們已經可以比較清晰地看到每個用戶的每次會話信息了。為了生成最終的效果,得到每次會話的開始時間和結束時間,可以基于用戶和會話編號再執行一次分組操作:

WITH user_access_session_flag AS ( SELECT user_id, access_time,CASE WHEN access_time  - INTERVAL '30' MINUTE <= lag(access_time) OVER (PARTITION BY user_id ORDER BY access_time) THEN 0ELSE 1END AS new_session -- 基于每次點擊和上次點擊時間間隔判斷是否新的會話FROM user_access
),
user_sessions AS (SELECT user_id, access_time,sum(new_session) OVER (PARTITION BY user_id ORDER BY access_time) AS session_num -- 基于new_session標識生成每次會話的編號FROM user_access_session_flag
)
SELECT user_id, session_num, min(access_time) AS start_time, max(access_time) AS end_time
FROM user_sessions
GROUP BY user_id, session_num
ORDER BY user_id, session_num; -- 分組獲取每個用戶每次會話的會話開始時間和結束時間user_id|session_num|start_time             |end_time               |
-------+-----------+-----------------------+-----------------------+1|          1|2025-04-30 07:00:00.000|2025-04-30 07:20:00.000|1|          2|2025-04-30 08:00:00.000|2025-04-30 08:10:00.000|2|          1|2025-04-30 07:05:00.000|2025-04-30 07:10:00.000|3|          1|2025-04-30 08:00:00.000|2025-04-30 08:00:00.000|

在以上查詢中,我們基于原始數據定義了臨時表 user_access_session_flag,然后又基于它定義了臨時表 user_sessions,接著基于這個臨時表進行分組分析,得到最終結果。

通過這個案例也可以看出,通用表表達式(WITH)編寫的代碼非常符號我們的閱讀理解習慣,推薦大家使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904915.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904915.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端取經路——現代API探索:沙僧的通靈法術

大家好,我是老十三,一名前端開發工程師。在現代Web開發中,各種強大的API就像沙僧的通靈法術,讓我們的應用具備了超乎想象的能力。本文將帶你探索從離線應用到實時通信,從多線程處理到3D渲染的九大現代Web API,讓你的應用獲得"通靈"般的超能力。 在前端取經的第…

window 顯示驅動開發-AGP 類型伸縮空間段

AGP 類型的伸縮空間段類似于線性光圈空間段。 但是&#xff0c;內核模式顯示微型端口驅動程序&#xff08;KMD&#xff09;不會通過 AGP 類型的伸縮空間段公開 dxgkDdiBuildPagingBuffer 回調函數的DXGK_OPERATION_MAP_APERTURE_SEGMENT和DXGK_OPERATION_UNMAP_APERTURE_SEGMEN…

從零開始學習three.js(15):一文詳解three.js中的紋理映射UV

1. UV 映射基礎概念 1.1 什么是 UV 坐標&#xff1f; 在三維計算機圖形學中&#xff0c;UV 坐標是將二維紋理映射到三維模型表面的坐標系統。UV 中的 U 和 V 分別代表2D紋理空間的水平&#xff08;X&#xff09;和垂直&#xff08;Y&#xff09;坐標軸&#xff0c;與三維空間…

代碼復用與分層

1. 代碼復用與分層 函數&#xff1a;將常用的代碼塊封裝成函數&#xff0c;提供自己或者團隊使用。 庫&#xff1a;將代碼打包成靜態或者動態庫&#xff0c;提供出來一個頭文件供自己或者團隊使用。比如stm32中的HAL庫。 框架&#xff1a;通常實現一個完整的系統性的代碼&am…

人臉真假檢測:SVM 與 ResNet18 的實戰對比

在人工智能蓬勃發展的當下&#xff0c;人臉相關技術廣泛應用于安防、金融、娛樂等諸多領域。然而&#xff0c;隨著人臉合成技術的日益成熟&#xff0c;人臉真假檢測成為保障這些應用安全的關鍵環節。本文將深入探討基于支持向量機&#xff08;SVM&#xff09;結合局部二值模式&…

類加載器, JVM類加載機制

1.類加載器 Java里有如下幾種類加載器 1.引導類加載器 負責加載支撐JVM運行的位于JRE的lib目錄下的核心類庫&#xff0c;比如rt.jar、charsets.jar等 2.擴展類加載器 負責加載支撐JVM運行的位于JRE的lib目錄下的ext擴展目錄中的JAR類包 3.應用程序類加載器 負責加載Class…

Hadoop 2.x設計理念解析

目錄 一、背景 二、整體架構 三、組件詳解 3.1 yarn 3.2 hdfs 四、計算流程 4.1 上傳資源到 HDFS 4.2 向 RM 提交作業請求 4.3 RM 調度資源啟動 AM 4.4 AM運行用戶代碼 4.5 NodeManager運行用戶代碼 4.6 資源釋放 五、設計不足 一、背景 有人可能會好奇&#xf…

串口屏調試 1.0

http://wiki.tjc1688.com 先把商家的鏈接貼過來 淘晶馳T1系列3.2寸串口屏tft液晶屏顯示屏HMI觸摸屏超12864液晶屏 這是主包的型號 打開這個玩意 有十個基本的功能區 新建工程 在界面的右邊&#xff0c;指令一定要寫在page前面&#xff0c;這里的波特率等等什么的都可以…

《設計數據密集型應用》——閱讀小記

設計數據密集型應用 這本書非常推薦看英語版&#xff0c;如果考過了CET-6就可以很輕松的閱讀這本書。 當前計算機軟件已經不是單體的時代了&#xff0c;分布式系統&#xff0c;微服務現在是服務端開發的主流&#xff0c;如果沒有讀過這本書&#xff0c;則強力建議讀這本書。 …

【SpringMVC】詳解cookie,session及實戰

目錄 1.前言 2.正文 2.1cookie與session概念 2.2返回cookie參數 2.3設置session 3.小結 1.前言 哈嘍大家好吖&#xff0c;今天繼續來給大家來分享SpringMVC的學習&#xff0c;今天主要帶來的是cookie與session的講解以及通過postman和fiddler來實戰&#xff0c;廢話不多…

令狐沖的互聯網大廠Java面試之旅

場景描繪&#xff1a;互聯網大廠Java面試 在某個陽光明媚的上午&#xff0c;令狐沖來到了風清揚所在的互聯網大廠&#xff0c;準備迎接他的Java開發工程師面試。風清揚是一位以嚴謹和深厚技術功底著稱的面試官&#xff0c;令狐沖稍顯緊張&#xff0c;但他相信自己的準備。 第…

照片to谷歌地球/奧維地圖使用指南

軟件介紹 照片to谷歌地球/奧維地圖是一款由WTSolutions開發的跨平臺圖片處理工具&#xff0c;能夠將帶有GPS信息的照片導入Google Earth&#xff08;谷歌地球&#xff09;或奧維地圖。該軟件支持Windows、Mac、iOS、Linux和Android系統&#xff0c;無需下載安裝&#xff0c;直…

客戶端建立一個連接需要占用客戶端的端口嗎

客戶端建立TCP連接時需占用本地端口&#xff0c;具體機制如下&#xff1a; 一、端口占用的必要性 四元組唯一性? TCP連接通過?源IP、源端口、目標IP、目標端口?四元組唯一標識。客戶端發起連接時&#xff0c;必須綁定本地端口以完成通信標識。 動態端口分配? 客戶端操作…

【生存技能】ubuntu 24.04 如何pip install

目錄 原因解決方案說明 在接手一個新項目需要安裝python庫時彈出了以下提示: 原因 這個報錯是因為在ubuntu中嘗試直接使用 pip 安裝 Python 包到系統環境中&#xff0c;ubuntu 系統 出于穩定性考慮禁止了這種操作 這里的kali是因為這臺機器的用戶起名叫kali,我也不知道為什么…

智能時代下,水利安全員證如何引領行業變革?

當 5G、AI、物聯網等技術深度融入水利工程&#xff0c;傳統安全管理模式正經歷顛覆性變革。在這場智能化浪潮中&#xff0c;水利安全員證扮演著怎樣的角色&#xff1f;又將如何重塑行業人才需求格局&#xff1f; 水利工程智能化轉型對安全管理提出新挑戰。無人機巡檢、智能監測…

TDengine 在智能制造中的核心價值

簡介 智能制造與數據庫技術的深度融合&#xff0c;已成為現代工業技術進步的一個重要里程碑。隨著信息技術的飛速發展&#xff0c;智能制造已經成為推動工業轉型升級的關鍵動力。在這一進程中&#xff0c;數據庫技術扮演著不可或缺的角色&#xff0c;它不僅承載著海量的生產數…

微調ModernBERT為大型語言模型打造高效“過濾器”

ModernBERT&#xff08;2024 年 12 月&#xff09;是最近發布的小型語言模型&#xff0c;由 Answer.AI、LightOn 和 HuggingFace 共同開發。它利用了現代優化技術&#xff0c;如用于 8,192 token 上下文窗口的 RoPE 和 GeGLU layers&#xff0c;在保持效率的同時提升性能。jina…

電網拓撲分析:原理與應用

在現代電力系統中&#xff0c;電網拓撲分析是一項至關重要的技術&#xff0c;它為電力系統的安全、穩定和高效運行提供了堅實的基礎。電網拓撲描述了電力系統中各元件&#xff08;如發電機、變壓器、輸電線路、負荷等&#xff09;之間的連接關系&#xff0c;通過拓撲分析&#…

OSPF案例

拓撲圖&#xff1a; 要求&#xff1a; 1&#xff0c;R5為ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作為企業邊界路由器&#xff0c; 出口公網地址需要通過PPP協議獲取&#xff0c;并進行chap認證 2&#xff0c;整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b;…

2D橫板跳躍游戲筆記(查漏補缺ing...)

1.Compression&#xff08;壓縮質量&#xff09;&#xff1a;可以改為None&#xff0c;不壓縮的效果最好&#xff0c;但占用內存 2.Filter Mode&#xff08;過濾模式&#xff09;&#xff1a;可以選擇Point&#xff08;no filter&#xff09; 3.Pixels Per Unit&#xff1a;是…