SQL166 每天的日活數及新用戶占比

SQL166 每天的日活數及新用戶占比

題目理解

本SQL查詢旨在分析用戶活躍數據,計算兩個關鍵指標:

  1. 每日活躍用戶數(DAU)
  2. 每日新增用戶占比(新用戶占活躍用戶的比例)

解題思路

1. 數據準備階段

首先我們需要獲取所有用戶的活躍記錄,包括:

  • 用戶進入時間(in_time)
  • 用戶離開時間(out_time)

由于一個用戶在同一天可能有多次活躍記錄,我們需要對數據進行去重處理。


2. 核心計算邏輯

通過三個CTE(Common Table Expressions)分步處理數據:

  1. ?user_activity_records?:合并所有活躍記錄

    • 從in_time和out_time中提取日期
    • 使用UNION合并結果并自動去重
  2. ?user_first_activity?:計算每個用戶的首次活躍日期

    • 按用戶分組
    • 使用MIN函數找出每個用戶的最早活躍日期
  3. ?user_activity_with_first_date?:關聯活躍記錄與首次活躍日期

    • 將活躍記錄與用戶首次活躍日期關聯
    • 為后續計算準備完整數據集

3. 最終指標計算

基于準備好的數據,計算兩個核心指標:

  1. ?daily_active_users?:每日活躍用戶數

    • 按日期分組
    • 使用COUNT(*)計算每日不重復用戶數
  2. ?new_user_ratio?:新增用戶占比

    • 判斷當前活躍日期是否為用戶的首次活躍日期
    • 計算新增用戶數占總活躍用戶數的比例
    • 使用ROUND保留兩位小數

技術亮點

  1. ?UNION自動去重?:高效處理用戶可能在同一天多次活躍的情況
  2. ?CTE分步處理?:使復雜查詢邏輯清晰易讀
  3. ?IF條件計數?:優雅地實現條件計數功能
  4. ?JOIN USING語法?:簡化相同列名的連接操作

最終代碼

WITH-- 獲取用戶活躍日期(合并in_time和out_time)user_activity_records AS (SELECTuid,DATE(in_time) AS activity_dateFROMtb_user_logUNIONSELECTuid,DATE(out_time) AS activity_dateFROMtb_user_log),-- 計算每個用戶的首次活躍日期user_first_activity AS (SELECTuid,MIN(activity_date) AS first_activity_dateFROMuser_activity_recordsGROUP BYuid),-- 合并活躍記錄和首次活躍日期user_activity_with_first_date AS (SELECTuar.uid,uar.activity_date,ufa.first_activity_dateFROMuser_activity_records uarJOINuser_first_activity ufa USING (uid))-- 計算每日活躍用戶數和新增用戶占比
SELECTactivity_date,COUNT(*) AS daily_active_users,ROUND(COUNT(IF(first_activity_date = activity_date, 1, NULL)) / COUNT(*),2) AS new_user_ratio
FROMuser_activity_with_first_date
GROUP BYactivity_date
ORDER BYactivity_date;

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

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

相關文章

【33】C# WinForm入門到精通 ——表格布局器TableLayoutPanel【屬性、方法、事件、實例、源碼】

WinForm 是 Windows Form 的簡稱,是基于 .NET Framework 平臺的客戶端(PC軟件)開發技術,是 C# 語言中的一個重要應用。 .NET 提供了大量 Windows 風格的控件和事件,可以直接拿來使用。 本專欄內容是按照標題序號逐漸…

uv使用教程

以下是使用 Python 包管理工具 uv 的常見命令指南。uv 是由 Astral(Ruff 的開發者)開發的高性能 Python 包安裝器和解析器,旨在替代 pip 和 pip-tools: 1. 安裝 uv uv官網倉庫 # Linux/macOS curl -Ls https://astral.sh/uv/in…

SpringBoot3.x入門到精通系列:1.1 簡介與新特性

SpringBoot 3.x 簡介與新特性 📖 什么是SpringBoot SpringBoot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化Spring應用的初始搭建以及開發過程。SpringBoot集成了大量常用的第三方庫配置,SpringBoot應用中這些第三方庫幾乎可以零配…

二、搭建springCloudAlibaba2021.1版本分布式微服務-Nacos搭建及服務注冊和配置中心

nacos介紹 1、Nacos簡介 Nacos 是阿里巴巴推出來的一個新開源項目,這是一個更易于構建云原生應用的動態服務發現、配置管理和服務管理平臺。 Nacos 致力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、…

淺談物聯網嵌入式程序開發源碼技術方案

在物聯網蓬勃發展的時代,嵌入式程序作為連接硬件與軟件的橋梁,發揮著至關重要的作用。以“邊緣智能 云協同”為核心,為工業、醫療、家居、農業、智慧城市五大場景提供穩定、低功耗、可擴展的物聯網終端與平臺一體化解決方案。以下董技叔軟件…

【筆記】重學單片機(51)

為學習嵌入式做準備,重新拿起51單片機學習。此貼為學習筆記,僅記錄易忘點,實用理論基礎,并不是0基礎。 資料參考:清翔零基礎教你學51單片機 51單片機學習筆記1. C語言中的易忘點1.1 數據類型1.2 位運算符1.3 常用控制語…

C++現代Redis客戶端庫redis-plus-plus詳解

🚀 C現代Redis客戶端庫redis-plus-plus詳解:告別繁瑣的hiredis,擁抱現代C的Redis操作 📅 更新時間:2025年07月28日 🏷? 標簽:C | Redis | redis-plus-plus | 現代C | 后端開發 文章目錄&#x…

Redis存儲原理與數據模型(上)

一、Redis數據模型 1.1、查看Redis數據定義: typedef struct redisDb {kvstore *keys; /* The keyspace for this DB 指向鍵值存儲的指針,用于快速訪問和修改數據庫中的鍵值對*/kvstore *expires; /* Timeout of keys with a t…

視頻生成模型蒸餾的方法

1.fastvideo https://github.com/hao-ai-lab/FastVideohttps://github.com/hao-ai-lab/FastVideo Distillation support Recipes for video DiT, based on PCM. Support distilling/finetuning/inferencing state-of-the-art open video DiTs: 1. Mochi 2. Hunyuan. 2.l

【mysql】—— mysql中的timestamp 和 datetime(6) 有什么區別,為什么有的地方不建議使用timestamp

在 MySQL 中,TIMESTAMP 和 DATETIME(6) 都是用于存儲日期和時間的數據類型,但它們在存儲范圍、時區處理、存儲方式等方面有顯著區別。 1. 核心區別對比 特性 TIMESTAMP DATETIME(6) 存儲范圍 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC(受限于 32 位時間戳) 1000…

前端下載文件相關

1、下載 ‘Content-Type‘: ‘application/octet-stream‘ 的文件 當后端返回的響應頭中 Content-Type 為 application/octet-stream 時,表示這是一個二進制流文件,瀏覽器無法直接展示,需要前端處理后下載到本地。 通過請求獲取二進制數據…

代碼隨想錄算法訓練營第五十六天|動態規劃part6

108.冗余連接 題目鏈接&#xff1a;108. 冗余的邊 文章講解&#xff1a;代碼隨想錄 思路&#xff1a; 題意隱含 只有一個冗余邊 #include <iostream> #include <vector> using namespace std; int n1001; vector<int>father(n,0);void init(){for(int i0;…

智能體通信協議

智能體通信協議A2AACPANPAgoraagents.jsonLMOSAITPA2A A2A官方文檔&#xff1a;https://www.a2aprotocol.net/docs/introduction 開源代碼和詳細規范&#xff1a;https://github.com/google/A2A ACP ACP官方文檔&#xff1a;https://acp.agentunion.cn ANP ANP官方文檔&am…

QT交叉編譯環境配置

QT交叉編譯環境配置1 配置交叉編譯工具鏈1.1 解壓 放到/opt中1.2 使用環境變量1.2.1 設置成永久的環境變量1.2.2 臨時環境變量1.3 安裝編譯需要的軟件2 編譯tslib庫&#xff08;如果不需要觸摸屏直接跳過&#xff09;3. 編譯qt3.1 編譯源碼3.2 設置QCreator4 說明4.1 關于編譯器…

【Android】【Java】一款簡單的文本/圖像加解密APP

寫在前面 之前寫過一篇博客,名為《【Java編程】【計算機視覺】一種簡單的圖片加/解密算法》,介紹了用Java在電腦上對圖片進行簡單的加密和解密操作,見鏈接: 文章鏈接 但是,文中所描述的算法在實際操作當中,存在嚴重的噪音(圖像失真)的問題(且原因不明),本次經筆者研…

技術筆記 | Ubuntu 系統 OTA 升級全流程詳解

前言&#xff1a;在嵌入式系統設備管理中&#xff0c;OTA&#xff08;Over-The-Air&#xff09;升級是實現設備遠程維護、功能迭代的核心能力。本文基于 Ubuntu 系統環境&#xff0c;詳細拆解 updateEngine 工具的 OTA 升級方案&#xff0c;從配置開啟、命令使用到實戰案例與問…

重復請求問題

重復請求問題 使用Promise和AbortController來實現思路是&#xff1a;通過在會話緩存中存儲和比較請求信息&#xff0c;來防止用戶在短時間內重復提交相同的請求。 具體思路如下&#xff1a; 存儲請求信息&#xff1a;每次請求時&#xff0c;將請求的相關信息&#xff08;如URL…

CentOS7 Docker安裝RocketMQ完整教程

目錄 前言 環境準備 系統要求 檢查Docker狀態 創建網絡和目錄 創建Docker網絡 創建數據目錄 安裝NameServer 啟動NameServer容器 參數說明 驗證NameServer啟動 安裝Broker 創建Broker配置文件 啟動Broker容器 參數說明 驗證Broker啟動 安裝管理控制臺 啟動控制…

main函數,常量指針與指針常量,野指針等,void與void的區別

指針&#xff08;續&#xff09; main函數原型 定義 main函數有多種定義格式&#xff0c;main函數也是函數&#xff0c;函數相關的結論對main函數也有效。 main函數的完整寫法&#xff1a;int main(int argc, char *argv[]){..}int main(int argc, char **argv){..}擴展寫法&am…

Mac m系列芯片安裝node14版本使用nvm + Rosetta 2

由于蘋果 M 系列芯片&#xff08;包括 M4&#xff09;使用的是 ARM 架構&#xff0c;而 Node.js 14 是在英特爾 x86 架構時代發布的&#xff0c;因此在 M 系列 Mac 上安裝 Node.js 14 可能會遇到兼容性問題 解決方法&#xff1a;使用 nvm Rosetta 2右鍵點擊「終端」→「顯示簡…