oracle之partition by與group by的區(qū)別

正文

前言

先來看兩個(gè)表

  • 主表(webcheck——存儲(chǔ)網(wǎng)站記錄)
webcheckid website
1 www.baidu.com
2 www.google.com
3 www.soso.com
  • 副表(webrecord——訪問網(wǎng)站記錄表)
webrecordid webcheckid access_state access_date
1 1 成功 2018-01-10 18:03:49
2 1 成功 2018-01-09 18:03:49
3 2 失敗 2018-01-11 18:03:49

我想要關(guān)聯(lián)副表,查詢每個(gè)網(wǎng)站最新訪問記錄,即使網(wǎng)站沒有訪問記錄,也要能查詢出來

  • 預(yù)計(jì)實(shí)現(xiàn)效果為
webcheckid website webrecordid access_state access_date
1 www.baidu.com 1 成功 2018-01-10 18:03:49
2 www.google.com 3 失敗 2018-01-11 18:03:49
3 www.soso.com
--以下是錯(cuò)誤的sql,唯一難住我的是就是關(guān)聯(lián)查詢最新記錄了,之前想當(dāng)然地用group by來分組獲取最新記錄,但是會(huì)報(bào)錯(cuò),group by的字段必須與查詢的字段相對應(yīng),除非是聚合函數(shù)包裹著
select a.WEBCHECKID,a.WEBSITE,b.RECORDID,b.access_state,b.access_date from TFSWXTS_WEBCHECK a left join TFSWXTS_WEBRECORD b on a.WEBCHECKID=b.WEBCHECKID 
group by b.WEBCHECKID,b.access_date having b.access_state=max(b.access_state) 
--報(bào)錯(cuò)不是group by 的表達(dá)式      

改為使用以下語句

row_number() over(partition by b.webcheckid order by b.access_date desc) 

--partition by 按字段分組
--order by 分組,按組內(nèi)排序,desc即最新在第一條
--row_number() 按分組內(nèi)的行個(gè)數(shù),生成行號;1,2,3,……

推出新的sql

--行號作為新字段,并用一個(gè)新select包裹,獲取第一行數(shù)據(jù),即為新記錄
select * from ( 
         select a.WEBCHECKID,a.WEBSITE,b.RECORDID,b.access_state,b.access_date,  
         
         row_number() over(partition by b.webcheckid order by b.access_date desc) as ran
          from TFSWXTS_WEBCHECK a left join TFSWXTS_WEBRECORD b on a.WEBCHECKID=b.WEBCHECKID 
        ) where recordid is  null or ran=1

-- recordid is null是為了防止當(dāng)前webrecord表里面沒有數(shù)據(jù),行號數(shù)據(jù)為混亂,行號此時(shí)就無法作為判斷條件

  • 例如當(dāng)soso和google在webrecord沒有訪問記錄時(shí),錯(cuò)誤實(shí)現(xiàn)效果為,soso這一數(shù)據(jù)沒有顯示出來
webcheckid website webrecordid access_state access_date ran
1 www.baidu.com 1 成功 2018-01-10 18:03:49 1
2 www.google.com 1
  • 去外部條件,我們來看看效果,可以看到soso的行號為2,明顯不正常,故需要增加 recordid is null,并需要or條件
webcheckid website webrecordid access_state access_date ran
1 www.baidu.com 1 成功 2018-01-10 18:03:49 1
1 www.baidu.com 1 成功 2018-01-09 18:03:49 2
2 www.google.com 1
1 www.soso.com 2

成功實(shí)現(xiàn)效果為

webcheckid website webrecordid access_state access_date ran
1 www.baidu.com 1 成功 2018-01-10 18:03:49 1
2 www.google.com 3 失敗 2018-01-11 18:03:49 1
3 www.soso.com 2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。