mysql時間序列與窗口函數


一、datetime 格式數據提取

mysql 中已存在列格式為 datetime 格式時,提取其中的年:

季度: quarter
月:month
周 :week 
日:day
時:hour
分:minute
秒:second
select year(a.`訂購日期`) from `訂單` a;

改變顯示格式方法:

1、格式化:
SELECT DATE_FORMAT(a.`訂購日期`,'%Y-%m') from `訂單` a;

2、字符串截取
select left(a.`訂購日期`,10) from `訂單` a;

二、mysql中關於date函數

向日期添加指定時間間隔函數
date_add(date,INTERVAL expr type)

向日期減去指定時間間隔函數
date_sub(date,INTERVAL expr type)

返回兩個日期之間的函數
datediff(date1,date2)

以不同的格式顯示時間
date_format(date,format)

三、查看連續登錄天數

這類問題,用窗口函數來解決更方便些,下面先列舉下常用的窗口函數

1、累計計算窗口函數 
sum、avg、max、min  
sum(...A...) over (partition by...B... order by ...C... rows between....D1...and...D2...)
partition by   分組字段
order by       按什么字段排序
rows...between  計算的行數范圍   移動求平均值常用

2、分區排序窗口函數
row_number() over (partition by...B... order by ...C...)     1 2 3 4 5
rank() over (partition by...B... order by ...C...)           1 1 1 4 5
dense_rank() over (partition by...B... order by ...C...)     1 1 1 2 3 

3、分組排序  
ntile() 不支持分組排序 rows ..between ...
ntile() over (partition by...B... order by ...C...)    前 10%的用戶

4、偏移分析窗口函數
應用場景 :解決今天和昨天的數據差
前offset 行數據
lag(exp_str,offset,defval) over (partition by...B... order by ...C...)

后offset 行數據
lead(exp_str,offset,defval) over (partition by...B... order by ...C...)

舉個例子

創建表,字段有 id,long_time 
create table user_login(user_id int,login_time date);

插入數據
insert into user_login values
(1,'2019-06-01'),
(1,'2019-06-02'),
(1,'2019-06-03'),
(1,'2019-06-06'),
(1,'2019-06-07'),
(1,'2019-06-08'),
(1,'2019-06-11'),
(1,'2019-06-12'),
(2,'2019-06-01'),
(2,'2019-06-02'),
(2,'2019-06-04'),
(3,'2019-06-01'),
(3,'2019-06-02'),
(4,'2019-06-01'),
(5,'2019-06-01'),
(5,'2019-06-02');

1、顯示出每個用戶連續登錄天數,不去重用戶

1、對原表增加分區排序窗口函數 row_number,按序號分組,時間排序
2、用date_sub()函數,登錄日期減去序號,如果是連續登錄日期,那么date_sub()函數結果就會一致
3、最后,將數據結果按id 和 date_sub()函數分組

SELECT user_id,
date_sub(login_time, INTERVAL rn DAY) AS login_group,  -- 連續登錄數據會一致
min(login_time) AS start_login_time,
max(login_time) AS end_login_time,
count(login_time) AS continuous_days
FROM
(SELECT user_id,login_time,
row_number () over (PARTITION BY user_id ORDER BY login_time) AS rn    分區排序窗口函數,分組、排序
FROM 
user_login) t
GROUP BY user_id, date_sub(login_time, INTERVAL rn DAY);/2、

2、計算連續出現n次數據問題

成績連續出現三次
解題思路 :
1、偏移分析窗口函數,將成績向上偏移兩位
2、計算score列與偏移后成績的差值,0值即連續的成績

SELECT id,score,(score - lead_score) as score3 from
(select id,score,lead(score,2) over (order by id) as lead_score from score order by id) a
WHERE  (score - lead_score)=0;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM