oracle 根據業務需求多表關聯抽取去重後的結果集的10%(我這裏是兩張表)

廢話不說直接粘代碼:

   select * from (  

                           select p.rn ,max(p.rn) over(partition by JXSDM) as rn_max,                           JXSDM,JXSMC,QKID,QKXM,QKSJH,QKZJH,QKZZMC,QKTYSHXYDM,SFEWGKGS,SBZJLX,

FDSYR,FRZJH,JYCZ,CZZJH, 
              CZSJH,CLVIN,CLZDXSRQ,CPH,YSHY,ZYYSHW,MZZZ   from
            (select row_number() over(partition by a.JXSDM order by a.JXSDM asc) as rn,a.JXSDM,a.JXSMC,a.QKID,a.QKXM,a.QKSJH,a.QKZJH,a.QKZZMC,a.QKTYSHXYDM,a.SFEWGKGS,a.SBZJLX,a.FDSYR,a.FRZJH,a.JYCZ,a.CZZJH, 
             a.CZSJH,a.CLVIN,a.CLZDXSRQ,a.CPH,a.YSHY,a.ZYYSHW,a.MZZZ
              from JFQKFX a inner join CD_CUSTOMERATTACHMENT b  on a.QKID = b.VKHID where to_char(to_date(CLZDXSRQ,'yyyy-MM-dd'),'yyyy-mm') = to_char(add_months(sysdate,-1), 'yyyy-mm') group by a.JXSDM,a.JXSMC,a.QKID,a.QKXM,a.QKSJH,a.QKZJH,a.QKZZMC,a.QKTYSHXYDM,a.SFEWGKGS,a.SBZJLX,a.FDSYR,a.FRZJH,a.JYCZ,a.CZZJH, 
             a.CZSJH,a.CLVIN,a.CLZDXSRQ,a.CPH,a.YSHY,a.ZYYSHW,a.MZZZ)p )  where  rn/rn_max <=0.1

解決問題的思路:在最內層獲取子集sql的語句中除rn字段外,將其他所有字段用group by 函數進行分組。查詢字段的時候不要用a.*,要查詢具體的字段。主要應用到的oracle函數:

1.row_number() over(partition by a.JXSDM order by a.JXSDM asc),意爲根據 a表中的JXSDM進行分組並排序,然後給每一行數據返回一個行號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章