午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

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

mysql - 如何寫一條SQL,分時段統(tǒng)計結果?

瀏覽:212日期:2022-06-14 08:54:15

問題描述

比如時間是過去24小時,將這過去24小時分成10等分,一條SQL查詢出10條記錄,也就是每個時間段的統(tǒng)計結果。一條SQL可以實現(xiàn)上述的需求嗎?謝謝:-)

我想到一種辦法,將這10條SQL用union拼接起來,請問一下還有其他的辦法嗎?

我的SQL是:

select sum(num) from T where time >= xx and time <= yy;

現(xiàn)在是要將[xx, yy]時間分成10等分,返回各個時間段的統(tǒng)計結果

問題解答

回答1:One SQL by Case When

你的需求用case when不就是可以做到的么?一條SQL搞定!!!!

select?sum(case?when?time?>= xx and time < xx + (yy - xx) / 10 then?1?else?0?end)?as time_1,?sum(case?when?time?>= xx + (yy - xx) / 10 and time < xx + 2 * (yy - xx) / 10 then?1?else?0?end)?as time_2,?sum(case?when?time?>= xx + 2 * (yy - xx) / 10 and time < xx + 3 * (yy - xx) / 10 then?1?else?0?end)?as time_3,..sum(case?when?time?>= xx + (i -1) * (yy - xx) / 10 and time < xx + i * (yy - xx) / 10 then?1?else?0?end)?as time_i.., sum(case?when?time?>= xx + 9 * (yy - xx) / 10 and time <= yy then?1?else?0?end)?as time_10?from?test where time >= xx and time <= yy;Better maintain

注意時間的減法要做好,推薦使用存儲過程封裝上面的sql,接收startTime,endTime和等分數(shù)三個參數(shù),計算各個區(qū)間的起始和結束時間(注意我的sql里面采用的是前閉后開,但是最后一個等分是要等于結束時間的!!!要不然就會丟了一個等于endTime的值未統(tǒng)計)然后把值傳入sql執(zhí)行就好了。這樣每次調(diào)用只需要調(diào)用一個存儲過程即可

你是不是真的需要這樣做?

其實我不清楚你具體的業(yè)務場景,但是我會說分情況做選擇

如果你在startTime和endTime之間查出來的數(shù)據(jù)不大,或者數(shù)據(jù)庫里面總量就不大,那么我建議二樓的@Paul_Ding的說法。

但是如果你的數(shù)據(jù)庫里面的記錄很大,或者經(jīng)常根據(jù)startTime和endTime查出幾十萬的記錄,那么推薦你使用一條SQL,這樣不用每次都把這么多的記錄通過網(wǎng)絡再傳到代碼里面去處理,不過這種要做簡單編程和計算的SQL,建議封裝到存儲過程里面會更好維護一些

不管上面兩種方式,其實只是復雜度的轉(zhuǎn)移,無非就是用更復雜的代碼,或者更復雜的SQL去解決問題,但是要根據(jù)自己的業(yè)務場景選擇的合適的就行。

回答2:

按等分時間函數(shù)分組就好了

回答3:

建議把24小時的查出來之后再進行分割,這樣開銷小一點,不必用sql做等分這種事情。

回答4:

我之前的做法是這樣:1、根據(jù)這個時間段[xx, yy]和等分數(shù)N去創(chuàng)建一個時間區(qū)段臨時表split_time_tableid start_time 1 2017-01-12 00:00:00 2 2017-01-12 02:24:00 3 2017-01-12 04:48:00

...

10 2017-01-12 21:36:00 (創(chuàng)建這個臨時表也是有技巧的,記得給id建主鍵)2、將這個臨時表去關聯(lián)你要查的表T

select t1.date_time,sum(t2.num) from split_time_table t1 left join T t2 on t2.time>=t1.start_time and t2.time<DATE_ADD(t1.start_time,INTERVAL 144 MINUTE) group by t1.id

上面的144是通過(yy-xx)/N計算得來的,上面的例子是按一天24小時10等分為例

這是一種方法,可以實踐下,里面的一些變量是可以通過傳入的參數(shù)動態(tài)計算的

回答5:

GROUP BY FLOOR(mod(time, 86400)/8640)

回答6:

說下oracle下的做法與思路吧。這個需求的難點在于等分10份,即使使用case when 依舊要:起始時間+等份時間段1,起始時間+等份時間段2,起始時間+等份時間段*3...利用oracle的層級查詢可以憑空造出1,2,3...10代碼如下:

SELECT LEVEL num FROM DUALCONNECT BY LEVEL <= 10

引用資料 再利用得到num進行乘以時間段(interval)事先算好

select sum(case when begintime+(level-1)*interval<time and time<begintime+level*interval then num else 0 end)from dual, tableconnect by level<=10

主站蜘蛛池模板: 国产又粗又猛又爽又黄的视频四季 | 伊人网在线播放 | 欧美日韩久久 | 天堂av一区二区三区 | 成人深夜网站 | 成人免费公开视频 | 国产高清一区二区三区 | 日韩免费a | 国产精品久久久久久69 | 国产又粗又爽又黄的视频 | 日韩av免费网址 | 国产精品久久久影院 | 在线看一区二区 | 手机看片日韩av | 国产成人一区二区三区 | 色综合小说 | 国产黄色精品视频 | 久久婷婷丁香 | 日本高清www免费视频 | 久久久精品在线观看 | 国产精品第六页 | 本站只有精品 | 波多野结衣久久精品 | 精品中文视频 | 亚洲男人天堂2017 | 日韩在线观看视频免费 | 久久久丁香 | 久久国产精品二区 | 国产精品久久久久永久免费看 | 琪琪色在线观看 | 经典久久 | 都市激情男人天堂 | www视频在线| 久久久综合久久久 | 中文在线免费观看 | 五月婷婷伊人网 | 亚洲欧美另类综合 | 亚洲午夜精品一区二区三区他趣 | 日本综合视频 | 91导航在线观看 | 黄色网址在线播放 |