原來SQL也可進行循環,一文介紹如何利用存儲過程進行留存分析

2021-01-10 社會愛智者521

在工作中,我們經常會遇到循環計算的需求。例如,計算一日留存率、二日留存率、……、N日留存率。如果N值不大,我們雖然可以通過合併多次查詢結果來解決,但代碼可讀性會差很多,而且運行速度也不快。

在《數據分析SQL必修教程,一個案例讓你明明白白》一文中我們就已經拋出來這個問題了,今天我們就利用存儲過程來解決這一類問題。

01什麼是存儲過程

存儲過程是實現經過編譯並存儲在資料庫中的一段SQL語句集合。它的思想很簡單,從名字中就可以看出來,它的主要功能就是進行數據的存儲。與普通增刪改查語句不同的是,它通過增加變量、控制等方法來豐富了進行存儲的條件。

簡單來說,當我們要插入10條數據時,要複製insert語句十次,但如果加入存儲過程的循環語句,一次就夠了。具有Java、Python編程基礎的人會很容易理解這一點。作為一種方法,就必要具有優點和缺點的。

(1)優點

存儲過程在創造時就進行編譯,以後每次執行都不需再重新編譯,從而提高執行速度;可重複使用,簡化資料庫開發人員工作;安全性高,可設定用戶的使用權。(2)缺點

往往定製化於特定的資料庫上,當切換到其它資料庫系統時,需重寫原有的存儲過程;性能調校與撰寫受限於資料庫系統。

02案例分析

本文仍是選用阿里天池中的淘寶用戶行為數據集進行介紹。

(1)數據集說明

該數據集記錄了2019-11-28至2019-12-03期間的行為數據,數據集中具有如下10個欄位,每個欄位均有注釋。

我們需要得到如下結果表。

(2)解決思路

創建如下的中間表;

寫出計算間隔天數為N的留存查詢語句,並利用存儲過程對間隔天數進行循環,每次循環結果寫入中間表中;對中間表進行行轉列,得到結果表。

03代碼呈現

接下來看代碼

(1)創建中間表

createtableretention(idint auto_increment, datevarchar(20) defaultnull, new_users varchar(20)defaultnull, nday_after intdefaultnull, retention_number intdefaultnull, primary key(id)); --建立中間表

(2)編寫存儲過程

truncate retention;

drop procedure if exists cal_retention;

delimiter $$

create procedure cal_retention (in nday int)

begin

set @i=1;

while @i<=nday do

insert intoretention(date,new_users,nday_after,retention_number)

select bh1.date ,count(distinct bh1.user_id) as new_users,

@i as nday_after,

count(distinct bh2.user_id) asretention_number

from

(select *

from(select *,from_unixtime(time_stamp) as datetime,

from_unixtime(time_stamp,'%y-%m-%d') as date,

from_unixtime(time_stamp,'%h:%i:%s') as time,

row_number() over(partition by user_id order by time_stamp asc) as rn

from behavior

where 1=1)t1

where rn=1) bh1

left join behavior bh2 on bh1.user_id=bh2.user_id and datediff(from_unixtime(bh2.time_stamp,'%y-%m-%d'),bh1.date)=@i

where 1=1

groupby bh1.date;

set @i=@i+1;

end while;

end $$

delimiter;

call cal_retention(2)

執行得到中間表。

(3)行轉列得到結果表

執行得到結果表。

04結語

雖然實際中數據分析師往往會藉助Python或R語言來解決類似的問題,但掌握存儲過程原理、知道存儲過程用途,對於數據分析師在和資料庫開發工程師打交道也是非常有幫助的!

相關焦點

  • 如何使用 SQL Server FILESTREAM 存儲非結構化數據?
    作者 | ALEN BRI譯者 | 火火醬,責編 | Carol封圖 | CSDN 付費下載於視覺中國在本文中,我將解釋如何使用SQL Server FILESTREAM來存儲非結構化數據。同時,還會介紹FILESTREAM的優缺點。
  • 淺析mysql存儲過程
    去年的強網杯,出了一道mysql堆疊注入叫隨便注,這道題被好多比賽玩了一整年,直到現在還是有各種新姿勢,但是今天我忽然想到似乎沒有對這個題目有一個很認真的分析,因此這裡總結一下這個題目的出題用意和原本的預期做法:堆疊注入Stacked injections:堆疊注入。從名詞的含義就可以看到應該是一堆sql語句(多條)一起執行。
  • DoSTOR存儲分析 用戶如何進行更有效的存儲採購
    DoSTOR存儲分析 12月9日消息:存儲廠商如何與客戶達成設備的銷售?對於小公司來說,是與他們打好關係;對於大公司來說,是準備好需求建議書。在不考慮公司規模的情況下,分析師和用戶均認為正確地識別需求,並將需求清晰地表述給廠商才是正確之道。
  • 關於mysql存儲過程和事務的概述
    存儲過程是sql語句和流程控制語句的預編譯集合,以一個名稱存儲並作為一個單元進行處理。基本語法:過程體:示例:存儲過程的參數:1.創建無參的存儲過程:2.創建帶有輸入參數和輸出參數的存儲過程:創建複合結構的存儲過程:1.使用條件判斷語句的存儲過程:2.使用循環語句的存儲過程
  • SQL Server 2014 可更新聚集列存儲索引
    在SQL Server 2012中一旦將非聚集列存儲索引建立在某個表上時,該表將變為只讀,即使在數據倉庫中使用列索引,每次更新或添加數據也會是一件非常瑣碎的事。SQL Server 2014中的可更新聚集列索引則解決了該問題。
  • 「數據分析報告」越級提升指南 Part1 ——數據部分
    巧婦難為無米之炊,數據之於數據分析師就好像食材之於巧婦,數據的重要性可見一斑,分析部分是數據分析師將數據做成報告的最重要一步,是最體現一個數據分析師功底的部分,也是拉開差距的部分,今天先為大家講一下如何撰寫數據報告中的數據部分,分析部分將在明日二條中為大家分享!
  • 如何利用Python實現SQL自動化?
    本文將為你展示如何操作。只要編寫好這個代碼,通過Python 連接到SQL 僅需:sql = Sql('database123')很簡單對麼?同時發生了幾件事,下面將對此代碼進行剖析。class Sql:首先要注意,這個代碼包含在一個類中。筆者發現這是合乎邏輯的,因為在此格式中,已經對此特定資料庫進行了增添或移除進程。若見其工作過程,思路便能更加清晰。
  • 用Select×進行SQL查詢的七宗罪
    下面,我將根據自己在應用編程中的實際經驗,向大家證明使用Select * from table進行SQL查詢的「七宗罪」。 不必要的I/O(輸入/輸出)   通過使用SELECT * ,您雖然可以獲得一些完全可以被忽略的返回數據,但是該獲取過程可並不是免費的。那些本來可能只需要從索引頁面中讀取的數據檢索,如今您卻不得不從各個頁面中以全量的方式讀取出來。顯然,此舉會導致資料庫端白白浪費各種有限的I/O周期。
  • 使用SQL Server In-Memory存儲ASP.NET的會話狀態
    Web應用程式主要利用Session狀態來協調彼此間的工作。作為對比,客戶端腳本較多的重量級web應用通常擁有更高的並發請求,這種情況下使用Session狀態訪問資源需要對Session加鎖和解鎖,從而成為了Web應用的瓶頸。不限制類型的Web應用將會成為另外一個瓶頸因為需要足夠的存儲空間維持它們的會話的狀態。
  • Mysql中一條SQL查詢語句是如何執行的?
    第三步:如果緩存中沒有找到就會進入解析器,解析器會對SQL語句進行語法分析、語義分析。打個比方:上面在 分析器中會將「select」這個關鍵詞分析出來,識別「table1」是表名,「ID」是列名等等。然後判斷這條語句語法是否正確。
  • PandaSQL:一個讓你能夠通過SQL語句進行pandas的操作的python包
    這篇文章將介紹一種在pandas的dataframe中使用SQL的python包,並且使用一個不等連結的查詢操作來介紹PandasSQL的使用方法。不等連接(Non-equi join)假設你必須連接兩個dataframe。其中一個顯示了我們對某些商品進行促銷的時間段。
  • 如何進行競爭對手分析?
    企業在追求自身發展過程中,須對競爭對手進行深入的分析,正所謂《孫子兵法》中的「知己知彼,百戰不殆;不知彼而知己,一勝一負;不知彼,不知己,每戰必殆」。然而,企業進行競爭對手分析的目的不盡相同(如:順應制定戰略的需要、順應制定市場策略的需要、順應《卓越績效評價準則》和《卓越績效評價準則實施指南》條款要求等),其實質是:渴望永葆市場活力,在行業中不斷取得先進地位。
  • 【SQL】詳細講解如何進行Hive性能優化
    2.性能低下的根源hive性能優化時,把HiveQL當做M/R程序來讀,即從M/R的運行角度來考慮優化性能,從更底層思考如何優化運算性能,而不僅僅局限於邏輯代碼的替換層面。最後得出的結論是:避實就虛,用 job 數的增加,輸入量的增加,佔用更多存儲空間,充分利用空閒 CPU 等各種方法,分解數據傾斜造成的負擔。3.配置角度優化我們知道了性能低下的根源,同樣,我們也可以從Hive的配置解讀去優化。
  • 深入理解 Java 虛擬機-如何利用 VisualVM 對高並發項目進行性能分析
    前面在學習JVM的知識的時候,一般都需要利用相關參數進行分析,而分析一般都需要用到一些分析的工具,因為一般使用IDEA,而VisualVM對於IDEA也不錯,所以就選擇VisualVM來分析JVM性能,這篇文章就介紹一下如何利用VisualVM進行性能分析,以及在分析之前需要知道一些GC優化的原則,GC
  • 如何用Excel進行預測分析?
    請使用Excel進行分析。【分析思路】第1日(次日)留存用戶數=第1日新增用戶數*次日留存率第2日活躍用戶數=第2日新增用戶數+第1日留存用戶數第3日活躍用戶數=第3日新增用戶數+第2日留存用戶數(第2日新增用戶數*第2日留存率)+第1日留存用戶數...
  • 如何進行可重複性研究?
    你不知道論文中是否有「刻意追星」行為,你更擔心外審意見回來後,你該如何對著學生的論文另起爐灶地跑一次回歸?作為合作者: 你的合作者想了解一下你的實證分析過程,以便確認一些關鍵環節的處理是否妥當。然後,你們視頻通話,你用了一上午的時間給他演示如何一步一步「點菜單」,以便得到你想要的結果。
  • 適用於初學者和分析師的SQL –使用Python入門SQL
    而且,如果您是分析的初學者,則還應該查看免費的「 Business Analytics入門 」課程。 目錄 什麼是資料庫?一個資料庫是存儲在一個電子格式相互關聯的數據有組織的集合。它的結構使其可以輕鬆訪問和操縱存儲的數據。組織使用它來存儲決策過程可能需要的任何信息。
  • 杭州網際網路企業如何辦理構建安全可信畢業證雲上數據存儲
    以下小編以阿里雲RDS(關係型資料庫服務)為例,來分析一下,阿里雲是如何進行全鏈路安全設計,進而保障用戶數據安全的;阿里雲RDS全鏈路安全設計跟據數據在業務系統裡流轉的途徑和時序,可以從兩個維度來對數據安全機制加以描述。
  • 黑客是如何利用你的瀏覽器進行挖礦的?
    4、DeepMiner家族網頁挖礦木馬介紹:  DeepMiner是一個開源的JS挖礦項目,也是在有訪問量的網站中嵌入一段網頁挖礦代碼,利用訪客的計算機CPU資源來挖掘數字貨幣進行牟利。  4.1、DeepMiner網頁挖礦腳本代碼,如下所示:
  • SQL 注入攻防入門詳解
    這幾天把sql注入的相關知識整理了下,希望大家多多提意見。(對於sql注入的攻防,我只用過簡單拼接字符串的注入及參數化查詢,可以說沒什麼好經驗,為避免後知後覺的犯下大錯,專門查看大量前輩們的心得,這方面的資料頗多,將其精簡出自己覺得重要的,就成了該文)下面的程序方案是採用 ASP.NET + MSSQL,其他技術在設置上會有少許不同。