成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

mysql - 如何寫一條SQL,分時(shí)段統(tǒng)計(jì)結(jié)果?

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

問(wèn)題描述

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

我想到一種辦法,將這10條SQL用union拼接起來(lái),請(qǐng)問(wèn)一下還有其他的辦法嗎?

我的SQL是:

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

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

問(wèn)題解答

回答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

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

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

其實(shí)我不清楚你具體的業(yè)務(wù)場(chǎng)景,但是我會(huì)說(shuō)分情況做選擇

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

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

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

回答2:

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

回答3:

建議把24小時(shí)的查出來(lái)之后再進(jìn)行分割,這樣開(kāi)銷小一點(diǎn),不必用sql做等分這種事情。

回答4:

我之前的做法是這樣:1、根據(jù)這個(gè)時(shí)間段[xx, yy]和等分?jǐn)?shù)N去創(chuàng)建一個(gè)時(shí)間區(qū)段臨時(shí)表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)建這個(gè)臨時(shí)表也是有技巧的,記得給id建主鍵)2、將這個(gè)臨時(shí)表去關(guān)聯(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是通過(guò)(yy-xx)/N計(jì)算得來(lái)的,上面的例子是按一天24小時(shí)10等分為例

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

回答5:

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

回答6:

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

SELECT LEVEL num FROM DUALCONNECT BY LEVEL <= 10

引用資料 再利用得到num進(jìn)行乘以時(shí)間段(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

主站蜘蛛池模板: 成人a毛片在线看免费全部播放 | 久久久久免费 | 久久久国产一区二区三区丝袜 | 国产精选在线视频 | 欧美性精品hd在线观看 | 欧美日韩高清在线观看一区二区 | 精品视频一区二区三区四区 | 一区二区三区日本视频 | 国产精品精品 | 欧美午夜在线播放 | 欧美成人极品怡红院tv | 九九色视频 | 国产欧美日韩在线观看 | 美女黄网站 | 美国一级毛片完整高清 | 欧美特黄一级片 | 一本色道久久爱88av | 日本在线观看一级高清片 | 国产成人精品视频在放 | 国产成人免费网站在线观看 | 欧美成人综合 | 亚洲天堂在线视频观看 | 欧美在线视频 一区二区 | 青青草国产免费一区二区 | 成人a毛片免费视频观看 | 欧美高清亚洲欧美一区h | 亚洲字幕 | 永久免费观看午夜视频在线 | 综合图片亚洲网友自拍10p | 国产呦系列免费 | 国产一区二区三区免费观看 | 日本免费在线一区 | 久久国内精品自在自线软件 | 国产步兵社区视频在线观看 | 三级视频网站在线观看播放 | 成年人网站在线观看视频 | 中文字幕视频在线 | 亚洲一级毛片免费在线观看 | 性做久久久久久久免费看 | 国产大陆亚洲精品国产 | www.日本三级 |