橫掃SQL面試——PV、UV問題

📊 橫掃SQL面試:UV/PV問題

在這里插入圖片描述

🌟 什么是UV/PV?

在數據領域,UV(Unique Visitor,獨立訪客)PV(Page View,頁面訪問量) 是最基礎也最重要的指標:

  • 👥 UV:統計時間段內的唯一用戶數(按用戶ID去重)
  • 📄 PV:統計時間段內的總訪問次數(不去重)

🏆 UV/PV問題為什么重要?

  1. 業務價值:直接反映網站/APP的用戶規模和活躍度

  2. 面試高頻:90%的數據崗位面試都會涉及,掌握后能輕松應對留存率、轉化率等復雜指標

  3. 異常分析:UV突然下降可能原因(渠道故障/數據丟失等)

  4. 衍生指標

    • 人均PV = PV / UV
    • 訪問深度 = PV / 會話數
    • 跳出率 = 只訪問一頁的會話 / 總會話數

🚀 實戰練習

1.計算每日uv、pv
訪問記錄表access_log,包含字段id(自增主鍵)、user_id(用戶ID)、access_date(訪問日期)、page_id(頁面ID)。

  • 計算出每天的UV和PV。

在這里插入圖片描述

  • 計算出某個特定頁面(假設頁面ID為100)的UV和PV。

在這里插入圖片描述

  • 計算每個用戶最近7天的平均PV

在這里插入圖片描述


2. 對比新老用戶的PV貢獻占比

用戶訪問日志表user_visits,包含字段:user_id(用戶ID),visit_time(訪問時間),page_url(訪問頁面)。

用戶信息表users,包含字段:user_id(用戶ID),register_date(注冊日期)。

  • 區分新用戶(注冊后7天內訪問)和老用戶(注冊7天后訪問)
  • 計算新老用戶各自的PV總量

在這里插入圖片描述
在這里插入圖片描述

  • 計算新老用戶PV占總PV的比例

在這里插入圖片描述
最終查詢也可:

在這里插入圖片描述

完整代碼:

-- 第一步:創建CTE (Common Table Expression) 計算每個訪問記錄的用戶類型
WITH user_visit_stats AS (SELECT v.user_id,           -- 用戶IDv.visit_time,        -- 訪問時間u.register_date,     -- 注冊日期CASE -- 判斷用戶類型:注冊后7天內訪問的為新用戶,否則為老用戶WHEN DATEDIFF(v.visit_time, u.register_date) <= 7 THEN '新用戶'ELSE '老用戶'END AS user_type     -- 用戶類型標記FROM user_visits v       -- 訪問記錄表JOIN users u ON v.user_id = u.user_id  -- 關聯用戶信息表
),-- 第二步:按用戶類型分組統計PV總量
pv_summary AS (SELECT user_type,          -- 用戶類型COUNT(*) AS pv_count -- 計算每種用戶類型的PV總量FROM user_visit_stats   -- 使用上一步的結果GROUP BY user_type      -- 按用戶類型分組
),-- 第三步:計算所有用戶的總PV量
total_pv AS (SELECT SUM(pv_count) AS total  -- 匯總所有PVFROM pv_summary                -- 使用上一步的分組統計結果
)-- 最終查詢:計算每種用戶類型的PV占比
SELECT p.user_type,p.pv_count,ROUND(p.pv_count * 100.0 / (SELECT SUM(pv_count) FROM pv_summary), 2) AS pv_percentage
FROM pv_summary p
ORDER BY p.pv_count DESC;SELECT p.user_type,                   -- 用戶類型p.pv_count,                    -- 該類型的PV數量ROUND(p.pv_count * 100.0 / t.total, 2) AS pv_percentage  -- 計算占比(百分比)
FROM pv_summary p                  -- 用戶類型分組統計
CROSS JOIN total_pv t              -- 與總PV量交叉連接(確保每行都能計算占比)
ORDER BY p.pv_count DESC;          -- 按PV數量降序排列

  • 計算每日新老用戶的PV占比趨勢

在這里插入圖片描述
在這里插入圖片描述

完整代碼:

-- 第一步:創建CTE標記每日每條訪問記錄的用戶類型
WITH daily_user_types AS (SELECT DATE(v.visit_time) AS visit_date,  -- 將訪問時間轉為日期格式(去掉時分秒)v.user_id,                         -- 用戶IDCASE -- 判斷用戶類型:注冊后7天內訪問的為新用戶,否則為老用戶WHEN DATEDIFF(v.visit_time, u.register_date) <= 7 THEN '新用戶'ELSE '老用戶'END AS user_type                   -- 用戶類型標記FROM user_visits v                     -- 訪問記錄表JOIN users u ON v.user_id = u.user_id  -- 關聯用戶信息表
),-- 第二步:按日期和用戶類型分組統計PV量
daily_pv AS (SELECT visit_date,       -- 訪問日期user_type,        -- 用戶類型COUNT(*) AS pv_count  -- 計算每日每類用戶的PV總量FROM daily_user_types -- 使用上一步的結果GROUP BY visit_date, user_type  -- 按日期和用戶類型分組
),-- 第三步:計算每日的總PV量(不分用戶類型)
daily_totals AS (SELECT visit_date,              -- 訪問日期SUM(pv_count) AS daily_total  -- 計算每日所有用戶的總PV量FROM daily_pv                -- 使用上一步的分組統計結果GROUP BY visit_date          -- 按日期分組
)-- 最終查詢:計算每日每類用戶的PV占比
SELECT d.visit_date,                      -- 訪問日期d.user_type,                       -- 用戶類型d.pv_count,                        -- 該類型的PV數量ROUND(d.pv_count * 100.0 / t.daily_total, 2) AS percentage  -- 計算占比(百分比)
FROM daily_pv d                       -- 每日用戶類型分組統計
JOIN daily_totals t ON d.visit_date = t.visit_date  -- 關聯每日總PV量(按日期匹配)
ORDER BY d.visit_date, d.user_type;   -- 按日期和用戶類型排序

3. 識別"高價值用戶"(UV高且PV高)

用戶訪問日志表user_visits,包含字段:user_id(用戶ID),visit_time(訪問時間),page_url(訪問頁面)。

  • 找出訪問天數多且訪問頁面多——前20%的"高價值用戶"

使用 NTILE 分桶

在這里插入圖片描述


留個作業:(有難度哈)

基于流量與轉化率的酒店分類篩選

現有一張名為 hotel 的表,用于記錄酒店的相關數據,表結構如下:

字段名數據類型說明
id唯一標識酒店的唯一編號
pv整數酒店的展現量(PV,Page View)
cnt整數酒店的支付訂單量

要求根據上述表中的數據,篩選出以下三類酒店的 id

  1. 高流高轉:在流量降序排列的前 20% 的酒店中,篩選出有支付訂單(cnt > 0)的酒店,并且這些酒店的轉化率在降序排列的前 20%。
  2. 高流低轉:在流量降序排列的前 20% 的酒店中,篩選出轉化率升序排列的前 20% 的酒店(包括沒有支付訂單的酒店,即 cnt = 0 的情況)。
  3. 低流高轉:在流量升序排列的前 20% 的酒店中,篩選出有支付訂單(cnt > 0)的酒店,并且這些酒店的轉化率在降序排列的前 20%。

這道題有點優雅:

在這里插入圖片描述


-- 使用 WITH 子句創建一個名為 hotel_stats 的公共表表達式(CTE)
with hotel_stats as (-- 從 hotel 表中選擇所需的列,并計算一些統計信息select id,-- 計算酒店的總數,使用窗口函數對整個結果集進行計數count(*) over() as all_hotel_num,-- 對酒店按照展現量(pv)降序排名,使用窗口函數 row_number()row_number() over(order by pv desc) as rk_pv,   -- 展現量-- 判斷酒店是否有支付訂單,有則標記為 1,否則標記為 0case when cnt > 0 then 1 else 0 end as has_order,  -- 有訂單-- 對酒店按照轉化率(cnt / pv)降序排名,使用窗口函數 row_number()row_number() over(order by case when pv = 0 then 0 else cnt / pv end desc) as rk_change  -- 轉化率from hotel
)
-- 從 hotel_stats 子查詢中選擇所需的列,并根據排名情況對酒店進行分類
select id,-- 根據排名和是否有訂單的情況,對酒店進行分類case -- 高流高轉:流量排名在前 20% 且有訂單  且轉化率排名在前 20%when rk_pv / all_hotel_num <= 0.2 and has_order = 1 and rk_change / all_hotel_num <= 0.2 then '高流高轉'-- 高流低轉:流量排名在前 20% 且轉化率排名在后 20%when rk_pv / all_hotel_num <= 0.2 and rk_change / all_hotel_num >= 0.8 then '高流低轉'-- 低流高轉:流量排名在后 20% 且有訂單且轉化率排名在前 20%when rk_pv / all_hotel_num >= 0.8 and has_order = 1 and rk_change / all_hotel_num <= 0.2 then '低流高轉'-- 其他情況標記為未知else '未知' end as lable
from hotel_stats;

在這里插入圖片描述

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

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

相關文章

【C++】第八節—string類(上)——詳解+代碼示例

hello&#xff0c;又見面了&#xff01; 云邊有個稻草人-CSDN博客 C_云邊有個稻草人的博客-CSDN博客——C專欄&#xff08;質量分高達97&#xff01;&#xff09; 菜鳥進化中。。。 目錄 一、為什么要學習string類&#xff1f; 1.1 C語言中的字符串 1.2 面試題(暫不做講解) …

如何判斷JVM中類和其他類是不是同一個類

如何判斷JVM中的類是否為同一個類 在Java虛擬機(JVM)中&#xff0c;判斷兩個類是否相同需要同時滿足以下三個條件&#xff1a; 1. 類全限定名必須相同 包括包名類名的完整路徑必須完全一致例如&#xff1a;java.lang.String和com.example.String被視為不同類 2. 加載該類的…

ifconfig 使用詳解

目錄 一、基本語法二、常見用途及示例1. 查看所有網絡接口信息2. 啟用/禁用網絡接口3. 配置 IP 地址和子網掩碼4. 修改 MAC 地址5. 啟用混雜模式&#xff08;Promiscuous Mode&#xff09;6. 設置 MTU&#xff08;最大傳輸單元&#xff09; 三、其他選項四、常見問題1. 新系統中…

1. 標準庫的強依賴(核心原因)

1. 標準庫的強依賴&#xff08;核心原因&#xff09; 容器操作&#xff08;如 std::vector 擴容&#xff09; 當標準庫容器&#xff08;如 std::vector&#xff09;需要重新分配內存時&#xff0c;它會嘗試移動現有元素到新內存&#xff0c;而非拷貝&#xff08;為了性能&…

【MySQL】常用SQL--持續更新ing

一、配置信息類 1.查看版本 select version; 或 select version(); 2.查看配置 show global variables where variable_name in (basedir,binlog_format,datadir,expire_logs_days,innodb_buffer_pool_size,innodb_log_buffer_size,innodb_log_file_size,innodb_log_files_i…

Day82 | 靈神 | 快慢指針 重排鏈表

Day82 | 靈神 | 快慢指針 重排鏈表 143.重排鏈表 143. 重排鏈表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 筆者直接給跪了&#xff0c;這個難度真是mid嗎 直接去看靈神的視頻 環形鏈表II【基礎算法精講 07】_嗶哩嗶哩_bilibili 1.簡單來說就是&#xf…

常見的微信個人號二次開發功能

一、常見開發功能 1. 好友管理 好友列表維護 添加/刪除好友 修改好友信息&#xff08;備注、標簽等&#xff09; 分組管理 創建/編輯/刪除標簽 好友分類與篩選 2. 消息管理 信息發送 支持多類型內容&#xff1a;文本、圖片、視頻、文件、小程序、名片、URL鏈接等 附加功…

Android打包及上架應用市場問題處理

一、Gradle 配置參數含義&#xff1a; compileSdkVersion: 29 表示項目編譯時使用的 Android SDK 版本為 API 29&#xff08;Android 10&#xff09;&#xff0c;僅影響編譯階段的行為&#xff08;如代碼語法檢查、資源處理等&#xff09;&#xff0c;不直接影響運行時兼容性。…

Docker 從入門到進階 (Win 環境) + Docker 常用命令

目錄 引言 一、準備工作 1.1 系統要求 1.2 啟用虛擬化 二、安裝Docker 2.1 安裝WSL 2 2.2 安裝Docker Desktop 2.3檢查是否安裝成功 三、配置Docker 3.1 打開Docker配置中心 四、下載和管理Docker鏡像 4.1 拉取鏡像 4.2 查看已下載的鏡像 4.3 運行容器 4.4 查看正…

計算機視覺5——運動估計和光流估計

一、運動估計 &#xff08;一&#xff09;運動場&#xff08;Motion Field&#xff09; 定義與物理意義 運動場是三維場景中物體或相機運動在二維圖像平面上的投影&#xff0c;表現為圖像中每個像素點的運動速度矢量。其本質是場景點三維運動&#xff08;平移、旋轉、縮放等&a…

介質訪問控制——信道劃分

什么是介質訪問 介質訪問&#xff08;Medium Access&#xff09;? 是計算機網絡中一種規則&#xff0c;用來解決 ??“多臺設備如何共享同一根網線/信道傳輸數據”? 的問題。你可以理解為&#xff1a; 想象一條只能容一輛車通過的獨木橋&#xff08;網絡中的網線、Wi-Fi信道…

ERP系統五大生產模式概述

制造業中,選擇合適的生產模式是企業高效運營的關鍵。 以下是ERP系統支持的五大核心生產模式及其特點總結: 1. MTS(按庫存生產) - 定義:先生產后銷售,基于需求預測提前備貨。 - 適用場景:需求穩定、標準化程度高的產品(如日用品、家電)。 - 優點:交貨快、生產…

ubantu操作筆記

安裝ssh服務 1.1 基本安裝 sudo apt update sudo apt install openssh-server -y sudo systemctl start ssh sudo systemctl enable ssh 1.2 配置遠程root登陸 # 0. 設置root密碼 sudo passwd root # 1. 安裝vim依賴 sudo apt-get install vim -y # 2. 編輯配置文件 s…

2-vim編輯器的安裝和使用

一.常用工具介紹 前言&#xff1a; 我們想要編寫c語言代碼&#xff0c;可以使用linux系統提供的工具才能進行代碼的編輯。代碼編寫后&#xff0c;我們還需要驗證代碼的書寫正確。這就需要借助編譯器來進行驗證。linux系統為我們提供了比較好的開發工具。 vim編輯器&#xff…

小剛說C語言刷題——第16講 switch語句

在日常生活中&#xff0c;我們經常會遇到多分支的情況。當分支較多時&#xff0c;我們可以用嵌套的if-else語句。但是這樣會讓結構顯得混亂。這個時候我們可以考慮用switch語句。 1.語法格式 switch (表達式) { case 常量表達式1&#xff1a; 語句1; break; case 常量表達式…

使用 Python 連接 PostgreSQL 數據庫,從 `mimic - III` 數據庫中篩選數據并導出特定的數據圖表

要使用 Python 連接 PostgreSQL 數據庫&#xff0c;從 mimic - III 數據庫中篩選數據并導出特定的數據圖表&#xff0c;你可以按照以下步驟操作&#xff1a; 安裝所需的庫&#xff1a;psycopg2 用于連接 PostgreSQL 數據庫&#xff0c;pandas 用于數據處理&#xff0c;matplot…

過孔的載流能力

PCB過孔的載流能力&#xff08;即能安全承載的電流大小&#xff09;主要與以下因素相關&#xff1a; 1. 過孔的尺寸 孔徑&#xff08;直徑&#xff09;&#xff1a;孔徑越大&#xff0c;橫截面積越大&#xff0c;載流能力越強。 孔壁銅厚&#xff1a;電鍍銅的厚度&#xff08…

(done) 并行計算 CS149 Lecture2 (現代多核處理器) (SIMD, 多核, 超標量, 數據預取, 超線程)

視頻 url: https://www.bilibili.com/video/BV1du17YfE5G?spm_id_from333.788.videopod.sections&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 大佬筆記 url: https://zhuanlan.zhihu.com/p/8129089606 先看視頻&#xff1a; Lecture 0 ~ 28min 的內容基本就是 c…

Leetcode 3508. Implement Router

Leetcode 3508. Implement Router 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3508. Implement Router 1. 解題思路 這一題就是按照題意寫作一下對應的函數即可。 我們需要注意的是&#xff0c;這里&#xff0c;定義的類當中需要包含以下一些內容&#xff1a; 一個所有i…

Linux: 系統內核中的信號

目錄 一 前言 二 信號在內核中的表示 三 sigset_t 四 信號集操作 1. sigpending() 2. sigemptyset() 3. sigfillset() 4. sigaddset ()和sigdelset() 5. sigismember() 6. sigprocmask() 五 深入理解信號的捕捉流程 一 前言 在Linux: 進程信號初識-CSDN博客信…