日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

mysql查詢每小時數據和上小時數據的差值實現思路詳解

瀏覽:26日期:2023-10-15 12:25:31

一、前言

需求是獲取某個時間范圍內每小時數據和上小時數據的差值以及比率。本來以為會是一個很簡單的sql,結果思考兩分鐘發現并不簡單,網上也沒找到參考的方案,那就只能自己慢慢分析了。

剛開始沒思路,就去問DBA同學,結果DBA說他不會,讓我寫php腳本去計算,,這就有點過分了,我只是想臨時查個數據,就不信直接用sql查不出來,行叭,咱們邊走邊試。

博主這里用的是笨方法實現的,各位大佬要是有更簡單的方式,請不吝賜教,評論區等你!

mysql版本:

mysql> select version();+---------------------+| version() |+---------------------+| 10.0.22-MariaDB-log |+---------------------+1 row in set (0.00 sec)

二、查詢每個小時和上小時的差值

1、拆分需求

這里先分開查詢下,看看數據都是多少,方便后續的組合。

(1)獲取每小時的數據量

這里為了方便展示,直接合并了下,只顯示01-12時的數據,并不是bug。。

select count(*) as nums,date_format(log_time,’%Y-%m-%d %h’) as days from test where 1 and log_time >=’2020-04-19 00:00:00’ and log_time <= ’2020-04-20 00:00:00’ group by days;+-------+---------------+| nums | days |+-------+---------------+| 15442 | 2020-04-19 01 || 15230 | 2020-04-19 02 || 14654 | 2020-04-19 03 || 14933 | 2020-04-19 04 || 14768 | 2020-04-19 05 || 15390 | 2020-04-19 06 || 15611 | 2020-04-19 07 || 15659 | 2020-04-19 08 || 15398 | 2020-04-19 09 || 15207 | 2020-04-19 10 || 14860 | 2020-04-19 11 || 15114 | 2020-04-19 12 |+-------+---------------+

(2)獲取上小時的數據量

select count(*) as nums1,date_format(date_sub(date_format(log_time,’%Y-%m-%d %h’),interval -1 hour),’%Y-%m-%d %h’) as days from test where 1 and log_time >=’2020-04-19 00:00:00’ and log_time <= ’2020-04-20 00:00:00’ group by days;+-------+---------------+| nums1 | days |+-------+---------------+| 15114 | 2020-04-19 01 || 15442 | 2020-04-19 02 || 15230 | 2020-04-19 03 || 14654 | 2020-04-19 04 || 14933 | 2020-04-19 05 || 14768 | 2020-04-19 06 || 15390 | 2020-04-19 07 || 15611 | 2020-04-19 08 || 15659 | 2020-04-19 09 || 15398 | 2020-04-19 10 || 15207 | 2020-04-19 11 || 14860 | 2020-04-19 12 |+-------+---------------+

注意:

1)獲取上小時數據用的是date_sub()函數,date_sub(日期,interval -1 hour)代表獲取日期參數的上個小時,具體參考手冊:https://www.w3school.com.cn/sql/func_date_sub.asp2)這里最外層嵌套了個date_format是為了保持格式和上面的一致,如果不加這個date_format的話,查詢出來的日期格式是:2020-04-19 04:00:00的,不方便對比。

2、把這兩份數據放到一起看看

select nums ,nums1,days,days1 from (select count(*) as nums,date_format(log_time,’%Y-%m-%d %h’) as days from test where 1 and log_time >=’2020-04-19 00:00:00’ and log_time <= ’2020-04-20 00:00:00’ group by days) as m,(select count(*) as nums1,date_format(date_sub(date_format(log_time,’%Y-%m-%d %h’),interval -1 hour),’%Y-%m-%d %h’) as days1 from test where 1 and log_time >=’2020-04-19 00:00:00’ and log_time <= ’2020-04-20 00:00:00’ group by days1) as n;+-------+-------+---------------+---------------+| nums | nums1 | days | days1 |+-------+-------+---------------+---------------+| 15442 | 15114 | 2020-04-19 01 | 2020-04-19 01 || 15442 | 15442 | 2020-04-19 01 | 2020-04-19 02 || 15442 | 15230 | 2020-04-19 01 | 2020-04-19 03 || 15442 | 14654 | 2020-04-19 01 | 2020-04-19 04 || 15442 | 14933 | 2020-04-19 01 | 2020-04-19 05 || 15442 | 14768 | 2020-04-19 01 | 2020-04-19 06 || 15442 | 15390 | 2020-04-19 01 | 2020-04-19 07 || 15442 | 15611 | 2020-04-19 01 | 2020-04-19 08 || 15442 | 15659 | 2020-04-19 01 | 2020-04-19 09 || 15442 | 15398 | 2020-04-19 01 | 2020-04-19 10 || 15442 | 15207 | 2020-04-19 01 | 2020-04-19 11 || 15442 | 14860 | 2020-04-19 01 | 2020-04-19 12 || 15230 | 15114 | 2020-04-19 02 | 2020-04-19 01 || 15230 | 15442 | 2020-04-19 02 | 2020-04-19 02 || 15230 | 15230 | 2020-04-19 02 | 2020-04-19 03 |

可以看到這樣組合到一起是類似于程序中的嵌套循環效果,相當于nums是外層循環,nums1是內存循環。循環的時候先用nums的值,匹配所有nums1的值。類似于php程序中的:

foreach($arr as $k=>$v){ foreach($arr1 as $k1=>$v1){ }}

既然如此,那我們是否可以像平時寫程序的那樣,找到兩個循環數組的相同值,然后進行求差值呢?很明顯這里的日期是完全一致的,可以作為對比的條件。

3、使用case …when 計算差值

select (case when days = days1 then (nums - nums1) else 0 end) as difffrom (select count(*) as nums,date_format(log_time,’%Y-%m-%d %h’) as days from test where 1 and log_time >=’2020-04-19 00:00:00’ and log_time <= ’2020-04-20 00:00:00’ group by days) as m,(select count(*) as nums1,date_format(date_sub(date_format(log_time,’%Y-%m-%d %h’),interval -1 hour),’%Y-%m-%d %h’) as days1 from test where 1 and log_time >=’2020-04-19 00:00:00’ and log_time <= ’2020-04-20 00:00:00’ group by days1) as n;效果:+------+| diff |+------+| 328 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || -212 || 0 || 0

可以看到這里使用case..when實現了當兩個日期相等的時候,就計算差值,近似于php程序的:

foreach($arr as $k=>$v){ foreach($arr1 as $k1=>$v1){ if($k == $k1){ //求差值 } }}

結果看到有大量的0,也有一部分計算出的結果,不過如果排除掉這些0的話,看起來好像有戲的。

4、過濾掉結果為0 的部分,對比最終數據

這里用having來對查詢的結果進行過濾。having子句可以讓我們篩選成組后的各組數據,雖然我們的sql在最后面沒有進行group by,不過兩個子查詢里面都有group by了,理論上來講用having來篩選數據是再合適不過了,試一試

select (case when days = days1 then (nums1 - nums) else 0 end) as difffrom (select count(*) as nums,date_format(log_time,’%Y-%m-%d %h’) as days from test where 1 and log_time >=’2020-04-19 00:00:00’ and log_time <= ’2020-04-20 00:00:00’ group by days) as m,(select count(*) as nums1,date_format(date_sub(date_format(log_time,’%Y-%m-%d %h’),interval -1 hour),’%Y-%m-%d %h’) as days1 from test where 1 and log_time >=’2020-04-19 00:00:00’ and log_time <= ’2020-04-20 00:00:00’ group by days1) as n having diff <>0;結果:+------+| diff |+------+| -328 || 212 || 576 || -279 || 165 || -622 || -221 || -48 || 261 || 191 || 347 || -254 |+------+

這里看到計算出了結果,那大概對比下吧,下面是手動列出來的部分數據:

當前小時和上個小時的差值: 當前小時 -上個小時

本小時 上個小時 差值15442 15114 -32815230 15442 21214654 15230 57614933 14654 -27914768 14933 165

可以看到確實是成功獲取到了差值。如果要獲取差值的比率的話,直接case when days = days1 then (nums1 - nums)/nums1 else 0 end 即可。

5、獲取本小時和上小時數據的降幅,并展示各個降幅范圍的個數

在原來的case..when的基礎上引申一下,繼續增加條件劃分范圍,并且最后再按照降幅范圍進行group by求和即可。這個sql比較麻煩點,大家有需要的話可以按需修改下,實際測試是可以用的。

select case when days = days1 and (nums1 - nums)/nums1 < 0.1 then 0.1when days = days1 and (nums1 - nums)/nums1 > 0.1 and (nums1 - nums)/nums1 < 0.2 then 0.2when days = days1 and (nums1 - nums)/nums1 > 0.2 and (nums1 - nums)/nums1 < 0.3 then 0.3when days = days1 and (nums1 - nums)/nums1 > 0.3 and (nums1 - nums)/nums1 < 0.4 then 0.4when days = days1 and (nums1 - nums)/nums1 > 0.4 and (nums1 - nums)/nums1 < 0.5 then 0.5when days = days1 and (nums1 - nums)/nums1 > 0.5 then 0.6 else 0 end as diff,count(*) as diff_numsfrom (select count(*) as nums,date_format(log_time,’%Y-%m-%d %h’) as days from test where 1 and log_time >=’2020-03-20 00:00:00’ and log_time <= ’2020-04-20 00:00:00’ group by days) as m,(select count(*) as nums1,date_format(date_sub(date_format(log_time,’%Y-%m-%d %h’),interval -1 hour),’%Y-%m-%d %h’) as days1 from test where 1 and log_time >=’2020-03-20 00:00:00’ and log_time <= ’2020-04-20 00:00:00’ group by days1) as n group by diff having diff >0;

結果:

+------+-----------+| diff | diff_nums |+------+-----------+| 0.1 | 360 || 0.2 |10 || 0.3 | 1 || 0.4 | 1 |+------+-----------+

三、總結

1、 sql其實和程序代碼差不多,拆分需求一步步組合,大部分需求都是可以實現的。一開始就慫了,那自然是寫不出的。2、 不過復雜的計算,一般是不建議用sql來寫,用程序寫會更快,sql越復雜,效率就會越低。3、 DBA同學有時候也不靠譜,還是要靠自己啊

補充介紹:MySQL數據庫時間和實際時間差8個小時

url=jdbc:mysql://127.0.0.1:3306/somedatabase?characterEncoding=utf-8&serverTimezone=GMT%2B8

數據庫配置后面加上&serverTimezone=GMT%2B8

到此這篇關于mysql查詢每小時數據和上小時數據的差值的文章就介紹到這了,更多相關mysql 每小時數據差值內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美va亚洲va日韩∨a综合色| 久久99伊人| 日韩精品国产精品| 西西人体一区二区| 一区二区国产精品| 色8久久久久| 国产精品15p| 国产精品久久777777毛茸茸| 久久国产乱子精品免费女| 国产欧美精品| 日韩精品亚洲专区| 国产精品magnet| 国产成人调教视频在线观看| 日韩不卡在线| 亚洲欧美日韩视频二区| 亚洲精品进入| 欧美国产另类| 日韩网站中文字幕| 亚洲视频国产| 欧美成人一二区| 欧美影院三区| 精品一区二区三区中文字幕视频 | 亚洲精品在线a| 亚洲午夜精品久久久久久app| 91成人精品观看| 国产成人免费| 欧美日韩视频| 国产三级一区| а√天堂8资源中文在线| 亚洲福利精品| 国产精品久久久久久模特| 91亚洲国产高清| 精品一区二区三区免费看| 国产不卡人人| 大香伊人久久精品一区二区| 亚洲特级毛片| 久久av影院| 快she精品国产999| 国产日韩欧美三区| 深夜视频一区二区| 国产精品巨作av| 丝袜美腿高跟呻吟高潮一区| 成人午夜网址| 国产免费av国片精品草莓男男| 精品欧美久久| 久久uomeier| 青青草视频一区| 天堂成人国产精品一区| 国产成人精品一区二区三区免费 | 日本视频一区二区| 精品1区2区3区4区| 日韩中文在线电影| 精品资源在线| 久久影视三级福利片| 亚洲精品女人| 视频一区中文字幕精品| 亚洲在线网站| 欧美日韩国产探花| 不卡av一区二区| 激情欧美国产欧美| 久久精品高清| 亚洲大片在线| 欧美精品一区二区三区精品| 精品免费视频| 国产精品99一区二区三区| 久久精品国产网站| 国产成人免费视频网站视频社区| 国产美女久久| 精品三级在线| 欧美日韩视频免费观看| 国产a久久精品一区二区三区| 精品精品99| 免费看久久久| 欧美日韩国产v| 久久久久.com| 国产精品日韩欧美一区| 首页亚洲欧美制服丝腿| 免费人成精品欧美精品| 蜜臀久久99精品久久久久久9| 首页国产欧美日韩丝袜| 日韩欧美中文字幕一区二区三区 | re久久精品视频| 日韩和欧美一区二区三区| 欧美精品影院| 伊人久久在线| 在线亚洲激情| 久久99精品久久久久久园产越南| 国语精品一区| 香蕉精品视频在线观看| 日韩国产一二三区| 日韩电影在线视频| 在线精品福利| 久久久免费人体| 欧美日韩国产一区二区三区不卡| 婷婷亚洲成人| 日韩理论片av| 国产亚洲字幕| 伊人久久成人| 高清一区二区三区av| 欧美日韩国产欧| 精品一区二区三区视频在线播放| 久久一区二区三区喷水| 欧美专区一区| 蜜桃成人av| 精品精品99| 欧美一区成人| 久久xxxx| 综合日韩av| 国产探花在线精品一区二区| 国产综合视频| 精品日本视频| 日韩精品久久久久久久软件91| 欧美日韩国产v| 免费看一区二区三区| 天堂成人免费av电影一区| 中文字幕成在线观看| 国产欧美二区| 欧美日韩亚洲一区二区三区在线| 日韩一级欧洲| 蜜桃视频在线网站| 精品国产一区二区三区噜噜噜| 日韩二区三区在线观看| 日韩免费福利视频| 国产66精品| 国产一区二区三区黄网站| 久久国际精品| 久久精品99国产精品日本| 蜜桃一区二区三区在线观看| 欧美中文字幕一区二区| 桃色一区二区| 极品av在线| 青青久久av| 久久久久午夜电影| 日本欧美不卡| 亚洲视频综合| 国产亚洲综合精品| 日本亚洲欧洲无免费码在线| 在线国产日韩| 91嫩草精品| 国产精品国产三级国产在线观看| 成年男女免费视频网站不卡| 日本一区二区高清不卡| 特黄毛片在线观看| 国户精品久久久久久久久久久不卡| 日韩国产网站| 亚洲精品精选| 久久精品国产亚洲aⅴ| 欧美丝袜一区| 欧美一级一区| 韩国久久久久久| 亚洲欧美日韩专区| 国产精品一区免费在线| 六月丁香综合在线视频| 快播电影网址老女人久久| 欧美成人综合| 日韩一区二区三区高清在线观看| 美女久久99| 国产亚洲毛片在线| 国产精品115| 国产精品视区| 久久一区亚洲| 在线国产日韩| 日韩成人高清| 国产精品主播| 亚洲综合精品| 神马午夜在线视频| 国产精品一级| 91高清一区| 国产成人免费精品| 91精品国产自产在线丝袜啪| 欧美 日韩 国产精品免费观看| 国产丝袜一区| 老牛国产精品一区的观看方式| 丰满少妇一区| 91成人在线精品视频| 中文久久精品| 欧美成人基地| 手机在线电影一区| 国产欧美二区| 日韩av一区二区在线影视| 在线精品小视频| 亚洲最新无码中文字幕久久| 日本中文字幕不卡| 另类亚洲自拍| 一区久久精品| 亚洲激情欧美| 国产综合激情| 午夜久久美女| 日韩视频一区| 最新国产拍偷乱拍精品| 亚洲网站视频| 亚洲手机视频| 国产一区日韩一区| 久久中文亚洲字幕| 久久激情中文| 亚洲激情五月| 日韩在线观看一区二区| 亚洲日本久久| 久久精品青草| 尤物在线精品|