日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Oracle之SQL分析函数

發(fā)布時(shí)間:2024/4/13 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle之SQL分析函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這個(gè)做統(tǒng)計(jì)分析的時(shí)候就用的比較多了,咱們來(lái)看一下ORACLE的分析函數(shù),就是OVER函數(shù),OVER PARTITION BYOVER PARTITION BY ORDER BY,還有row_number,還有rollup,然后還有cube,還有g(shù)rouping,這些語(yǔ)法結(jié)合去使用的一種,主要是去做統(tǒng)計(jì)分析的,你可能要去做一些財(cái)務(wù)的報(bào)表啊,舉個(gè)列子,這里有幾條數(shù)據(jù),然后這邊有個(gè)小計(jì),小計(jì)就是把這幾列做一下匯總,然后還有一個(gè)合計(jì),或者是總計(jì),把幾個(gè)小計(jì)再做最后一個(gè)匯總,就是做一些表格的時(shí)候需要做的一些東西,可能你如果不做分析函數(shù)的話(huà),你只能用JAVA去實(shí)現(xiàn)了,好幾個(gè)DAO,做統(tǒng)計(jì),自己去查,一個(gè)一個(gè)去查,然后去拼成一個(gè)統(tǒng)計(jì)的表格,那如果要用ORACLE的話(huà),你可以去采用他的分析函數(shù)了,咱們首先看最簡(jiǎn)單的

我現(xiàn)在這一塊,咱們先查出來(lái),來(lái)看一下這個(gè)結(jié)果集

那這個(gè)結(jié)果集是啥意思呢,先跟著我的思路走,把EMP表的14條數(shù)據(jù),做一下這個(gè)統(tǒng)計(jì)分析,做什么分析呢,我們這里做一個(gè)連續(xù)的求和,這怎么做連續(xù)求和的呢,你會(huì)發(fā)現(xiàn)他有個(gè)特點(diǎn)是,部門(mén)10的都是8750,是這3個(gè)薪水之和,然后部門(mén)20的都是19625,就是部門(mén)20的這些人,薪水加起來(lái)就是19625,要不然就是部門(mén)30的,這些薪水加起來(lái)就是29025,第四列統(tǒng)計(jì)的都是總和,總和是什么意思呢,總和就是從頭到尾所有的薪水,就是這些SAL都加起來(lái),薪水是29025這個(gè)數(shù),你發(fā)現(xiàn)這個(gè)東西還是有增長(zhǎng)的,它是按照部門(mén)連續(xù)求和的,你發(fā)現(xiàn)他有什么區(qū)別呢,這前3個(gè)字段沒(méi)變,然后從第4個(gè)字段就要連續(xù)求和了,這邊sum(sal),把這個(gè)sal進(jìn)行匯總,然后進(jìn)行一個(gè)over,over表示一個(gè)函數(shù),然后over里面寫(xiě)的是order by deptno那首先我們不看這個(gè),我們看這個(gè)over然后什么也不加,改成總和,這是什么意思,這個(gè)over我可以不可以把它去掉,其實(shí)就相當(dāng)于去掉他就跟sum相等,這個(gè)就是所有員工的匯總,就是29025,我們現(xiàn)在這里面是ORDER BY,用什么去連續(xù)求和,我根據(jù)的是deptno,那我就把第一個(gè)部門(mén)就是8750,然后第二個(gè)部門(mén)的是,就是2975+3000+1100+800+3000,這是第二個(gè)部門(mén)的,你算一下這個(gè)結(jié)果等于多少啊,結(jié)果是10875,就是再加上8750就等于19625,就是這個(gè)數(shù),它是把第一個(gè)部門(mén)的和8750,然后加上第二個(gè)部門(mén)薪水的和,加起來(lái),等于的是19625,然后把19625再加上第三個(gè)部門(mén)的總和就等于29625,這是部門(mén)的連續(xù)求和,這是按照部門(mén)去分別求和,如果你看不明白,你可以把它換成姓名,就可以看清楚了,比如我這里改成ORDER BY ENAME

你可以看到這個(gè)薪水是一點(diǎn)點(diǎn)增長(zhǎng)的,然后加上1600,等于2700,2700加上2850,就等于5550,然后5500再加上2450就等于8000,然后繼續(xù)往下加,我現(xiàn)在按照的是名字,連續(xù)求和,就是一條記錄一條記錄連續(xù)的求和,最后得到的結(jié)果,剛才我是按照部門(mén),按照DEPNO連續(xù)求和的,而后面這個(gè)就是無(wú)所謂了,就是一個(gè)四舍五入的一個(gè)份額了,這個(gè)什么意思呢,拿你當(dāng)前的SAL,然后SUM(SAL),總數(shù)進(jìn)行一個(gè)除法運(yùn)算,SAL/SUM(SAL),然后結(jié)果保留5個(gè)有效數(shù)字,然后進(jìn)行乘以100,就是拿我的1100,就是和我的29025進(jìn)行除,除完了之后呢,肯定是0.0幾,然后我要保留5位有效數(shù)字,然后再乘以100,然后每個(gè)人占總薪水的份額,這個(gè)應(yīng)該很簡(jiǎn)單吧,剛才那個(gè)部門(mén)可能看著比較別扭,但是換成SAL就比較簡(jiǎn)單吧,這是一個(gè)最簡(jiǎn)單的OVER的用法,OVER加上ORDER BY的用法 咱們?cè)倏吹诙€(gè),可能是比較長(zhǎng),咱們看結(jié)果

上面就是over 加上 order by,我們這里加上一個(gè)partition,partition是什么意思呢,就是分區(qū),分區(qū)的意思,按照什么區(qū)域給我做什么事,那你看他有什么效果呢,你沒(méi)發(fā)現(xiàn)當(dāng)我按照分區(qū)了以后呢,部門(mén)連續(xù)求和了,咱們觀察一下這個(gè)東西,部門(mén)這個(gè)值是8750,第二個(gè)部門(mén)的是10875,第三個(gè)部門(mén)的總和是多少,是9400,那這三個(gè)值加在一起等于29025,這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)我是按照一個(gè)部門(mén)一個(gè)部門(mén)的去求總和的,這個(gè)就表示部門(mén)連續(xù)求和,這是怎么做的呢,注意看第二條語(yǔ)句,這里多了一個(gè)PARTITION BY DEPTNO,這個(gè)就是分區(qū),我就把它們當(dāng)成一個(gè)區(qū)間,一個(gè)區(qū)域單獨(dú)去計(jì)算,連續(xù)求和,按照ENAME連續(xù)求和,去給我遞增連續(xù)求和,算完了之后就完事了,第二個(gè)部門(mén)就是20部門(mén)這個(gè),給我按照這個(gè)部門(mén)這個(gè)區(qū)域連續(xù)求和,求出結(jié)果就可以了,同理第三個(gè)部門(mén)也是這樣的,這個(gè)DEPTNO給我連續(xù)求和,這個(gè)分區(qū)就是PARTITION BY,分區(qū)的意思,下面還有一塊就是這樣的,partition by deptno,就是部門(mén)的總和,你現(xiàn)在就是按照分區(qū)給我計(jì)算,over如果什么都不加,就是求最終的總和,如果加上按照部門(mén)分區(qū),你發(fā)現(xiàn)這是8750,這是第二個(gè)部門(mén)的總和,這是第三個(gè)部門(mén)的總和,然后這個(gè)就是占部門(mén)的份額了,你當(dāng)前第一個(gè)人的薪水,占我整個(gè)部門(mén)8750的比例,28%,57.14%,14.86%,然后再往下看就是連續(xù)求和了,剛才我寫(xiě)的這個(gè),我剛才寫(xiě)的是sum(sal) over (order by ename) 連續(xù)求和,直接按照這個(gè)求和也是一樣的,像這種寫(xiě)法就是等于這個(gè),就是一個(gè)一個(gè)加的,其實(shí)也可以寫(xiě)成這種,我按照order by,按照部門(mén),然后再按照名稱(chēng),部門(mén)一次,然后再按照名稱(chēng)來(lái)一次, sum(sal) over (order by deptno,ename) 連續(xù)求和,然后就是over什么也不加,sum(sal) over () 總和,然后就是求總的份額,partition by分區(qū)的概念,這個(gè)其實(shí)在真正的統(tǒng)計(jì)分析中還是非常有用的,這是ORACLE特殊的語(yǔ)法,這個(gè)東西應(yīng)該是不難的,其實(shí)就是把上面的簡(jiǎn)寫(xiě)

partition by deptno order by ename,部門(mén)分區(qū)了以后,再按照部門(mén)的名字繼續(xù)給我求和,那這個(gè)結(jié)果就是DEPT_SUM,分完區(qū)以后再按照名字給我累加,這個(gè)SUM就是求總和了

我們?cè)诩右粋€(gè)表EMPLOYEE,我加完EMPLOYEE這張表以后呢,我們來(lái)看看EMPLOYEE表有啥數(shù)據(jù)

數(shù)據(jù)很簡(jiǎn)單,首先是EMPID,567屬于40部門(mén),然后89屬于50部門(mén),總之就是一個(gè)部門(mén)的編號(hào),這里有一個(gè)每個(gè)人的薪水SALARY,大體上我們可以看到,有些人的薪水是相同的,比如第8是6500,咱們現(xiàn)在要做一個(gè)函數(shù)就是,ROW_NUMBER(),每個(gè)部門(mén)進(jìn)行一個(gè)大小的比較,舉個(gè)例子

執(zhí)行完這個(gè)SQL以后,結(jié)果是這樣的,也就是排個(gè)序嗎,10部門(mén)他的薪水給我排了一個(gè)序,550排在第一位,4500排在第二位,然后20部門(mén)呢,4800排在第一位,1900排在第二位,40部門(mén)肯定是44500排在第一,然后14500排在第二,然后6500排在第三,然后50部門(mén)的7500排在第一,6500的排在第二,把一個(gè)字段進(jìn)行大小的比較,那怎么做的呢,其實(shí)跟之前的區(qū)別就是多了一個(gè)函數(shù),Row_Number()函數(shù),就是Row_Number() over 然后不變,partition by deptid,先按部門(mén)分一個(gè)區(qū),10部門(mén)的分一個(gè)區(qū),20部門(mén)的分一個(gè)區(qū),40,50再給我分區(qū),分區(qū)之后再按照薪水給我desc,給我進(jìn)行一個(gè)排序,降序排序,ORDERY BY salary desc,薪水高的在最前面,薪水低的在最下面,然后這里起一個(gè)別面叫rank,as "排名",select employee.*, Row_Number() OVER (partition by deptid ORDER BY salary desc) as "排名" from employee;也是一樣的,這個(gè)就是關(guān)于Row_Number的用法

?

然后我們看另外一個(gè)小例子,可能有點(diǎn)復(fù)雜,建表然后插數(shù)據(jù),這個(gè)表的數(shù)據(jù)稍微有點(diǎn)多,首先這個(gè)表里面有兩個(gè)特殊的關(guān)鍵字,EARNMONTH,月份就是09年的12月份,和10年的1月份,一共就這兩個(gè)不同的數(shù)據(jù),整個(gè)月份就兩個(gè)月份,一個(gè)是09年的12月份,一個(gè)是10年的1月份,然后區(qū)域也就兩個(gè),要么就是北平,要么就是金陵,然后SNO有相同的也有不相同的,然后就是SNAME名稱(chēng),然后就是TIMES次數(shù),打工的次數(shù),SINGLEINCOME就是一次多少錢(qián),打工一次賺30塊錢(qián),那11次就是30*11就是330塊錢(qián),就是這個(gè)意思,這就是這幾個(gè)字段的一個(gè)介紹,那咱們就是用這個(gè)數(shù)據(jù)做一個(gè)分析

我現(xiàn)在想做group by這個(gè)分組,我代碼寫(xiě)完以后你就知道什么意思了,直接看group by 語(yǔ)句,先按月份分組,這個(gè)屬于分組了,我先按月份分組,月份分組之后再按區(qū)域分組,這個(gè)結(jié)構(gòu)就相當(dāng)于這樣的了,我們看到了這個(gè)表里面兩個(gè)字段,如果我單純的按照月份分組,那肯定就是兩條記錄,要么就是09年的12月份,要么就是10年的1月份,那肯定就是兩條記錄,如果這么分組的話(huà),但是我現(xiàn)在按照這個(gè)分組之后,再按照區(qū)域分組,所以區(qū)域也有分組的,這就產(chǎn)生四條記錄,0912 北平,0912金陵,1001北平,1001金陵,就是說(shuō)兩次分組嗎,我們看到的group by就是這樣的

這個(gè)分組應(yīng)該很簡(jiǎn)單吧,按照前兩個(gè)字段一個(gè)簡(jiǎn)單的分組,我現(xiàn)在想要用rollup,做一個(gè)分組,那這個(gè)rollup是怎么概念呢,rollup的概念是在group by 后面接rollup,這個(gè)是他的語(yǔ)法,就是在group by后面直接接rollup,他能做什么啊,他能夠在group by的分組上再加上earnmonth的匯總統(tǒng)計(jì),在分組,再進(jìn)行排序,加入我們現(xiàn)在這個(gè)是一個(gè)結(jié)果集,是進(jìn)行g(shù)roup by的一個(gè)結(jié)果集,group by兩個(gè),一個(gè)是按照時(shí)間月份,還有一個(gè)是按照AREA,還有一個(gè)是區(qū)域分組,第一次就是最簡(jiǎn)單的分組結(jié)果,要是我如果加上rollup的話(huà),我會(huì)在這個(gè)結(jié)果集的基礎(chǔ)之上,我再次進(jìn)行一個(gè)分組,這就是rollup的用法,先執(zhí)行這個(gè)結(jié)果,你發(fā)現(xiàn)這個(gè)東西就變成這樣了,首先按照12月份統(tǒng)一給我來(lái)一個(gè)匯總,那就是12月份是1179.5+975.83=2155.33,這樣的結(jié)果就是這樣的一個(gè)數(shù),他兩之和就是12月份,然后按照10年的1月份又給我匯總,他就這樣再分組,然后把這兩個(gè)結(jié)果相加等于最后這個(gè)數(shù)

就是做月份的小計(jì),這塊是做這個(gè)月份的小計(jì),然后這塊就是總計(jì),是不是可以做這樣的,如果你的界面需要這種統(tǒng)計(jì)分析的形式的話(huà),那你就需要寫(xiě)這樣的SQL語(yǔ)句,那現(xiàn)在你是利用ORACLE的分析函數(shù),可以很清晰的做一個(gè)統(tǒng)計(jì)分析的結(jié)果集,看他怎么寫(xiě)的呢,還是前面的是不變的,分組也不變,只是在group by 后面接了一個(gè)rollup,然后把rollup就把earnmonth和area包裹起來(lái),那正常來(lái)講我們是這么來(lái)寫(xiě)的,正常來(lái)講我們是group by earnmonth,area,現(xiàn)在我們的寫(xiě)法變量,group by rollup(earnmonth,area),然后把這個(gè)月份和區(qū)域包裹起來(lái),他肯定是按照earnmonth分組的,如果我把兩個(gè)換一下,我把它調(diào)換過(guò)來(lái),group by rollup(area,earnmonth),就按照AREA進(jìn)行再分組

不是按照時(shí)間,而是按照北平,然后北平再次分一下組,然后金陵的城市有多少,那我能不能只寫(xiě)一個(gè),這肯定不行,說(shuō)不是group by的表達(dá)式,他其實(shí)也是一個(gè)group表達(dá)式的一個(gè)升級(jí)版,group by的一個(gè)升級(jí)版,group by的要求就是分組,分組的一個(gè)數(shù)值,分組的字段,area,要么就是類(lèi)似一個(gè)SUM形式的,你沒(méi)法去弄一個(gè),只能兩個(gè)都得寫(xiě)上,你既然要查AREA,那AREA必須是一個(gè)分組字段,那咱們繼續(xù)往下看 還有一個(gè)更復(fù)雜的ORACLE的函數(shù),這個(gè)cube函數(shù)什么意思呢,咱們先執(zhí)行一下

你會(huì)發(fā)現(xiàn)這是另一種需求了,第一次分組之后先按月份分組,再次按照區(qū)域再次分一下組,那你發(fā)現(xiàn)按照月份分組,計(jì)算的兩個(gè)值,在按照區(qū)域分兩個(gè)值,給我統(tǒng)計(jì)一下他們之間的總和,cube是有這個(gè)功能,就是兩個(gè)字段分別計(jì)算,這個(gè)cube寫(xiě)法也很簡(jiǎn)單,group by cube(earnmonth,area),只是rollup改成了cube,就是這兩個(gè)字段需要再次去分組,那你就用這個(gè)cube,我們剛剛學(xué)了OVER,然后PARTITION,然后還有ORDER BY,OVER函數(shù)里寫(xiě)了PARTITION,ORDER BY,然后group里面有g(shù)roup by,也rollup,cube函數(shù) 然后就是grouping,這個(gè)函數(shù)挺簡(jiǎn)單的,你比如我們剛剛看的這個(gè)例子,rollup這個(gè)例子,我現(xiàn)在就是要這塊小計(jì),然后最后的空格變成小計(jì),這怎么辦呢,有人說(shuō)在JAVA里循環(huán),然后判斷AREA為空的時(shí)候再判斷,然后用一個(gè)JAVA區(qū)實(shí)現(xiàn)一個(gè)小計(jì),然后這塊也是用JAVA來(lái)實(shí)現(xiàn)一個(gè)小計(jì),其實(shí)ORACLE在設(shè)計(jì)的時(shí)候也考慮到了這一點(diǎn),所以他有了一個(gè)grouping函數(shù),就是為了用rollup和cube對(duì)結(jié)果集都會(huì)產(chǎn)生一個(gè)空值null,他匯總完以后就是一個(gè)空值,他不是北平也不是金陵,按的是月份分組的,所以這塊不知道寫(xiě)什么了,那你可以做什么事啊,就是這個(gè)語(yǔ)法嗎,我可以用grouping函數(shù),最終我執(zhí)行完了就變成這樣了,這可能是我們統(tǒng)計(jì)分析里面經(jīng)常用到的,這邊就是月份小計(jì),然后這塊也是月份小計(jì),然后這邊是一個(gè)總計(jì),就是grouping可以帶一個(gè)參數(shù),如果是本身結(jié)果就返回0,如果是合計(jì)的結(jié)果就返回1,我這邊就是case when了,這個(gè)是我們SQL通用的表達(dá)式,如果grouping(area)如果是等于1的話(huà),表示是合計(jì)的結(jié)果,我統(tǒng)計(jì)的肯定是月份,如果是不加grouping的話(huà),那肯定是一個(gè)空值,并且grouping(area)等于0,等于0是什么意思呢,是本身統(tǒng)計(jì)的一個(gè)結(jié)果,0912這塊本身沒(méi)有沖突,這塊是0912沒(méi)問(wèn)題的,這塊是空值,空的部分我就用月份小計(jì)替換一下,如果是匯總的就返回1,并且grouping(earnmonth)也是匯總,兩個(gè)都返回1,表示兩邊的值都是合計(jì),最后一塊他不知道寫(xiě)12月份還是1月份了,經(jīng)過(guò)匯總之后的一個(gè)空值,如果兩個(gè)都是空值的話(huà),那我就寫(xiě)成總計(jì),當(dāng)然我設(shè)置的是AREA這一個(gè)列,else就是原封不動(dòng)的輸出AREA

這個(gè)就是grouping函數(shù)的用法,可以去把空值替換成你要的結(jié)果,能理解這個(gè)意思嗎,其實(shí)不難,你不用ORACLE可能會(huì)覺(jué)得沒(méi)有多大的作用,沒(méi)關(guān)系的,我覺(jué)得再過(guò)一段時(shí)間吧,ORACLE一般第二個(gè)版本是屬于穩(wěn)定的版本,11G第一個(gè)版本也是不穩(wěn)定的,11g的第二個(gè)版本才是穩(wěn)定的,12C現(xiàn)在是第一個(gè)版本出了,12C如果第二個(gè)版本出了以后,集群肯定就特別特別的穩(wěn)定了,而且他那個(gè)集群是免費(fèi)的,所有的互聯(lián)網(wǎng)公司就考慮用12C吧,然后這個(gè)MYSQL肯定會(huì)被替代的,所以你可以提前當(dāng)做復(fù)習(xí)了,就是一個(gè)知識(shí)的補(bǔ)充,當(dāng)額外學(xué)習(xí)了,總之我們第一天講SQL的時(shí)候,這個(gè)跟整個(gè)的設(shè)計(jì)脫離的有一點(diǎn)點(diǎn)遠(yuǎn),但是是純ORACLE方向的 這三個(gè)函數(shù),一個(gè)叫RANK,一個(gè)叫dense rank,還有一個(gè)叫row_number,其實(shí)咱們可以看一下,我把這幾個(gè)直接運(yùn)行了一下

主要觀察Rank排名,你會(huì)發(fā)現(xiàn)其他的沒(méi)變,還是rank() over (partition by earnmonth,area order by personincome desc) 排名,只不過(guò)這塊變成rank()了,他這里又什么功效呢,排名第一個(gè)的他們兩個(gè)值都是第一,330都相等,這兩人并列第一,然后前面有兩個(gè)占位了,那么第三個(gè)這個(gè)就排名第三了,本身來(lái)說(shuō)這個(gè)是1,1,2,但是因?yàn)榍懊嬗袀€(gè)位置了,所以從第三個(gè)開(kāi)始數(shù)了,然后就是4,5

然后我們看一下dense_rank(),它是什么區(qū)別呢,他就是無(wú)論你前面有幾個(gè)人,你10個(gè)人并列第一,這個(gè)就給統(tǒng)計(jì)打分了 然后再往下看,第三種方式就是咱們的row_number,這是啥意思呢,我們不管你這個(gè)值薪水是不是相等,我都是按照順序123456這么往下排的,那我也給你分成1234,這個(gè)也是在統(tǒng)計(jì)分析的時(shí)候,總是要前幾名,以前我們做一些分析的時(shí)候,一個(gè)數(shù)據(jù),一個(gè)指標(biāo)最高,然后給我排一個(gè)名,排一個(gè)序

區(qū)別我們這里都有,我們這里還有一個(gè)累積求和,這個(gè)應(yīng)該是之前的內(nèi)容了

這個(gè)東西如果有時(shí)間的話(huà),可以讓你寫(xiě)的,這個(gè)語(yǔ)句啥意思呢,我查詢(xún)了這么多東西,然后主要是看第二行,sum(personincome),最后一個(gè)數(shù)據(jù),12月份第一個(gè)人叫大魁,11次,打工一次30塊錢(qián),一共330塊錢(qián),12月份他一共賺了330塊錢(qián),那就是薪水當(dāng)月的一個(gè)匯總,over (partition by sname order by personincome asc),那這個(gè)是啥意思呢,按照sname給我分區(qū),sname我記得每個(gè)人都有兩個(gè),然后1月份也有一個(gè),我把它兩個(gè)劃為一個(gè)區(qū)間,然后我按照薪水分組,asc,他兩就合并成一個(gè)人了,大魁就合并成一個(gè)人了,這是330,這是0元,就是330+0,一共就是330

這里有個(gè)大凱,一開(kāi)始是200,再加上350就是550了,1月份是0,然后加上330,大亮57.5+132=189.75,就可以利用over (partition by sname order by personincome asc),反正這三個(gè)是分析函數(shù)最常用的,組合over加上partition,加上order by,統(tǒng)計(jì)分析來(lái)回用這三個(gè)關(guān)鍵字,然后去做一些事情 還有就是做總和運(yùn)算,這塊有一個(gè)綜合運(yùn)算,我可以去求這些值里面的最高值,剛才我所有的都是用的sum,就包括我之前的連續(xù)求和,用的group by必須用的都是用的sum,其實(shí)你不僅可以用SUM,還可以用其他的,比如說(shuō)max最大,min最小,平均值,SUM,都可以去用,這里面的最高值,我進(jìn)行分組了以后,分組是按照earnmonth,area分的組,按照月份和AREA分的組,然后就是最高值,就是201912 金陵算唯一的一個(gè)數(shù)據(jù),分4組,兩個(gè)是唯一的一條記錄,然后給我區(qū)分一下最高值,區(qū)分一下最低值,平均值,然后總額

基本上ORACLE的分析函數(shù),基本上用法就這些,其實(shí)你做什么軟件都離不開(kāi)統(tǒng)計(jì)分析的,可能開(kāi)始要實(shí)現(xiàn)功能,總的做統(tǒng)計(jì)分析,你最終得做什么統(tǒng)計(jì)分析,精確的統(tǒng)計(jì)分析,你像我們的互聯(lián)網(wǎng)行業(yè)要求這種精確的統(tǒng)計(jì)分析,要求大概的范圍,海量數(shù)據(jù),你比如說(shuō)有幾億條數(shù)據(jù),要我做這種分析,分析兩行數(shù)據(jù)是無(wú)所謂的,就看一個(gè)大概的比值,如果你要涉及到一些真實(shí)的數(shù)據(jù)的話(huà),有的時(shí)候他要求的是精確,要求精確的話(huà)就得你自己的去做SQL的分析,不能依賴(lài)于hadoop,storm這些東西,你要做精確這事還得靠數(shù)據(jù)庫(kù),如果說(shuō)你自己寫(xiě)分析呢,用JAVA些腳本,用JAVA寫(xiě)代碼,然后查詢(xún)數(shù)據(jù)自己去寫(xiě)業(yè)務(wù)邏輯,寫(xiě)分析的規(guī)則,那這個(gè)也是挺麻煩的,ORACLE反正有這些分析函數(shù),SQL肯定是不支持,我個(gè)人覺(jué)得,MYSQL在過(guò)一兩個(gè)版本,就是過(guò)一兩年嗎,現(xiàn)在是5.6,MYSQL如果再過(guò)幾個(gè)版本,他肯定會(huì)出分析函數(shù),因?yàn)镸YSQL就屬于ORACLE下面的了,你想一下,MYSQL之前是沒(méi)有sysdate的,我印象中是沒(méi)有sysdate()函數(shù)的,肯定是沒(méi)有DAUL這張表,現(xiàn)在他都加上了,包括其實(shí)很多特性,以前都是ORACLE獨(dú)有的,現(xiàn)在MYSQL也都加上了,MYSQL里面有沒(méi)有分區(qū),就是create table 后面寫(xiě)partition,然后range,這種分區(qū),還有hash分區(qū),然后list分區(qū),MYSQL有分區(qū)嗎,你們用MYSQL的數(shù)據(jù)庫(kù),有吧,我記得也是有的,也是5.幾版本才有的,但是MYSQL5.0以下是沒(méi)有分區(qū)這個(gè)東西的,他不存在分區(qū),那個(gè)時(shí)候都得用分表分庫(kù),去做,包括現(xiàn)在也得用分表分區(qū)去做,是有區(qū)別的,肯定是有區(qū)別的,MYSQL正常來(lái)講是有分區(qū)的,也就什么意思呢,MYSQL收費(fèi)的肯定和免費(fèi)的不一樣,版本再往前靠一靠,ORACLE這些東西可能都有,但是都有的目的就是發(fā)現(xiàn)你使用MYSQL和你使用ORACLE,基本的用法都一樣,MYSQL的存儲(chǔ)過(guò)程的語(yǔ)法以后也得變一變,也得和ORACLE比較像,因?yàn)楫吘苟疾畈欢嗔?到最后兩個(gè)技術(shù)點(diǎn)都很像了,一個(gè)是MSYQL性能是很低的,一般情況下是不高的,你只能用集群,MYSQL就是做一個(gè)持久化,要不然你就用ORACLE,他的性能高,而且還有集群,然后這個(gè)時(shí)候ORACLE就讓你去選,你是ORACLE還是MYSQL,到時(shí)候都用ORACLE了,今天就講這么多東西,主要是做一個(gè)SQL語(yǔ)句的復(fù)習(xí),然后不了解ORACLE的熟悉一下ORACLE,技術(shù)點(diǎn)不同,但是概念都是想通的,就是一些技術(shù),比如事務(wù),鎖啊,還有索引啊

?

總結(jié)

以上是生活随笔為你收集整理的Oracle之SQL分析函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。