婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > mysql查詢每小時數據和上小時數據的差值實現思路詳解

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

熱門標簽:400電話到哪辦理優惠 南寧外呼系統招商 電話機器人是電腦呼號嗎 鄭州網絡外呼系統價錢 云南大數據外呼系統 機器人打電銷電話 怎么更改高德地圖標注 上海市三維地圖標注 博樂電銷機器人

一、前言

      需求是獲取某個時間范圍內每小時數據和上小時數據的差值以及比率。本來以為會是一個很簡單的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.asp
2)這里最外層嵌套了個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 diff
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;

效果:
+------+
| 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 diff
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 having diff >0;

結果:
+------+
| diff |
+------+
| -328 |
| 212 |
| 576 |
| -279 |
| 165 |
| -622 |
| -221 |
| -48 |
| 261 |
| 191 |
| 347 |
| -254 |
+------+

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

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

本小時 上個小時  差值
15442 15114  -328
15230 15442  212
14654 15230  576
14933 14654  -279
14768 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.1
when days = days1 and (nums1 - nums)/nums1 > 0.1 and (nums1 - nums)/nums1  0.2 then 0.2
when days = days1 and (nums1 - nums)/nums1 > 0.2 and (nums1 - nums)/nums1  0.3 then 0.3
when days = days1 and (nums1 - nums)/nums1 > 0.3 and (nums1 - nums)/nums1  0.4 then 0.4
when days = days1 and (nums1 - nums)/nums1 > 0.4 and (nums1 - nums)/nums1  0.5 then 0.5
when days = days1 and (nums1 - nums)/nums1 > 0.5 then 0.6
 else 0 end as diff,count(*) as diff_nums
from 
(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-8serverTimezone=GMT%2B8

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

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

您可能感興趣的文章:
  • Mysql 相鄰兩行記錄某列的差值方法

標簽:澳門 秦皇島 白銀 杭州 定西 恩施 寧夏 益陽

巨人網絡通訊聲明:本文標題《mysql查詢每小時數據和上小時數據的差值實現思路詳解》,本文關鍵詞  mysql,查詢,每小時,數據,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《mysql查詢每小時數據和上小時數據的差值實現思路詳解》相關的同類信息!
  • 本頁收集關于mysql查詢每小時數據和上小時數據的差值實現思路詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    777奇米成人网| 国产精品一级黄| 中国av一区二区三区| 欧美一级久久久| 精品久久人人做人人爰| 欧美高清dvd| 91.com视频| 91麻豆精品国产91久久久使用方法| 日本精品免费观看高清观看| 91色综合久久久久婷婷| 色一情一乱一乱一91av| 欧美色国产精品| 欧美大肚乱孕交hd孕妇| 2023国产精品自拍| 中文字幕一区二区三区视频| 亚洲乱码国产乱码精品精可以看| 亚洲图片欧美视频| 久久99精品久久久久久国产越南 | 国产日韩欧美精品综合| 国产无一区二区| 午夜免费欧美电影| 成人动漫中文字幕| 欧美xxxxx牲另类人与| 亚洲小少妇裸体bbw| 91在线一区二区| 亚洲国产精品v| 国产乱国产乱300精品| 欧美一级片免费看| 日韩福利视频网| 欧美日韩一区二区在线观看| 国产精品福利在线播放| 国产成人三级在线观看| 精品不卡在线视频| 蜜桃久久久久久| 日韩一区二区三区在线视频| 水野朝阳av一区二区三区| 制服丝袜日韩国产| 美日韩一区二区| 欧美电影免费观看高清完整版在线| 亚洲资源中文字幕| 在线不卡a资源高清| 蜜臀va亚洲va欧美va天堂 | 麻豆精品新av中文字幕| 91精品国产综合久久久蜜臀粉嫩 | 国产成人av一区| 久久久久久久久久电影| 国产成人综合在线| 成人免费在线播放视频| 色偷偷成人一区二区三区91| 亚洲午夜私人影院| 日韩一区二区三区观看| 国产成人综合亚洲91猫咪| 亚洲激情图片一区| 制服.丝袜.亚洲.另类.中文| 麻豆精品一区二区| 亚洲色大成网站www久久九九| 91黄色激情网站| 国产一区二区三区在线观看精品| 中文字幕在线不卡一区 | 美女视频一区二区三区| 国产精品乱码久久久久久| 色999日韩国产欧美一区二区| 亚洲va天堂va国产va久| 国产精品免费丝袜| 亚洲国产精品尤物yw在线观看| 欧美中文字幕亚洲一区二区va在线| 精品国产一区二区三区久久久蜜月| 日精品一区二区三区| 久久综合色婷婷| 9191国产精品| 91丨porny丨国产| 日本免费新一区视频| 国产精品久久久久久久久快鸭| 欧美日韩亚州综合| 97精品视频在线观看自产线路二| 美女www一区二区| 日韩精品一级中文字幕精品视频免费观看| 26uuu亚洲综合色欧美 | 一区在线观看免费| 久久免费国产精品| 久久这里都是精品| 欧美xxxxx裸体时装秀| 日韩免费视频一区| 国产无遮挡一区二区三区毛片日本| 精品欧美久久久| 国产欧美日韩精品一区| 国产女主播一区| 亚洲色图.com| 美女脱光内衣内裤视频久久网站| 国产精品理伦片| 国产清纯白嫩初高生在线观看91| 日韩视频一区二区三区在线播放| 在线播放一区二区三区| 亚洲精品在线观看网站| 久久毛片高清国产| 亚洲影视资源网| 久久99国产精品成人| 国产成人啪午夜精品网站男同| 国产米奇在线777精品观看| 国产精品亲子伦对白| 一区二区三区在线免费播放 | 欧美一级在线免费| 久久新电视剧免费观看| 欧美亚洲国产bt| 亚洲va欧美va人人爽| 日本中文在线一区| 欧美系列亚洲系列| 国产精品成人一区二区艾草 | 91丨九色丨尤物| 91免费精品国自产拍在线不卡 | 久久综合九色综合97婷婷女人 | 色婷婷久久久亚洲一区二区三区| 久久精品99国产国产精| 久88久久88久久久| 日韩一二三区不卡| 日本免费新一区视频| 欧美日韩在线精品一区二区三区激情 | 国产精品久久久久久久浪潮网站| 男男视频亚洲欧美| 欧美一级理论性理论a| 亚洲成人综合网站| 欧美日韩精品电影| 午夜不卡在线视频| 日韩一区二区免费高清| 日本vs亚洲vs韩国一区三区二区| 欧美一区二区啪啪| 国产suv精品一区二区6| 亚洲色图在线看| 91麻豆精品国产91久久久使用方法| 亚洲3atv精品一区二区三区| 欧美一级一区二区| 丁香激情综合国产| 香蕉影视欧美成人| 中文字幕高清一区| 精品视频免费在线| 波波电影院一区二区三区| 亚洲成人激情av| 久久久久久久久99精品| 在线观看成人免费视频| 国产91综合网| 日韩av在线播放中文字幕| 中文字幕中文字幕一区二区| 欧美日韩1区2区| 色综合中文综合网| 一二三四社区欧美黄| 亚洲精品在线电影| 欧美日韩精品一区二区三区| 粉嫩av一区二区三区粉嫩| 久久综合成人精品亚洲另类欧美| 亚洲一区二区视频| 国产精品久久午夜夜伦鲁鲁| 亚洲自拍欧美精品| 国产午夜久久久久| 欧美国产在线观看| 久久久不卡影院| 精品粉嫩aⅴ一区二区三区四区| 欧美三区在线观看| 欧美日韩在线播| 欧美日本高清视频在线观看| 欧美亚洲日本一区| 91成人免费电影| 欧美日韩综合在线免费观看| 色偷偷成人一区二区三区91| 色香色香欲天天天影视综合网| 91九色最新地址| 欧美精品高清视频| 欧美一区二区黄| 久久先锋资源网| 亚洲色图视频网| 亚洲综合色成人| 偷拍一区二区三区四区| 日本免费新一区视频| 另类中文字幕网| 成人免费精品视频| 8x8x8国产精品| 中文字幕欧美一区| 午夜不卡av在线| 91免费视频观看| 欧美精品一区二区三区蜜桃| 国产精品色哟哟| 午夜天堂影视香蕉久久| 国产成人啪午夜精品网站男同| 97久久超碰精品国产| 亚洲精品菠萝久久久久久久| 亚洲欧美另类图片小说| 蜜桃av一区二区三区| 国产精品一区二区免费不卡| 国内精品免费在线观看| 在线视频国产一区| 91精品国产综合久久香蕉的特点| 久久久夜色精品亚洲| 婷婷久久综合九色综合绿巨人| 精品一区二区免费视频| 欧美精选一区二区| 亚洲地区一二三色| 国产成人在线网站| 日韩亚洲电影在线| 香蕉久久夜色精品国产使用方法| av日韩在线网站| 一区免费观看视频|