標籤:
前段時間,公司更換新的PostgreSQL資料集市的系統過程中,自己下載了postgresqlAPI的pdf檔案研究了一下PostgreSQL資料集市。發現使用PostgreSQL過程語言可以大大加快自己處理資料的效率,下面就舉個例子吧!相信大家看了後,也會喜歡上PostgreSQL過程語言的.......
首先給出一段SQL指令碼,該SQL查詢2015年9月10日的欠費資料:
?
123456789 |
SELECT DISTINCT A.DAY_ID 統計日期 ,A.CHANNEL_NAME 支局名稱 ,A.OWE_MONTH 欠費賬期 ,SUM(B.current_charge) 日回收 FROM 表1 A LEFT JOIN 表2 B ON A.SERV_ID=B.SERV_ID WHERE A.AREA_ID=27 AND B.mkt_area_ID=27 AND A.DAY_ID=20150910 AND A.OWE_MONTH =201508 AND B.ACCT_MONTH=201508 GROUP BY A.DAY_ID,A.CHANNEL_NAME,A.OWE_MONTH |
雖然這個指令碼可以提取一天的欠費資料,那麼問題來了,如果你要提取9月1日到10的欠費資料,那不是要執行這個指令碼十次嗎?
當然這裡有更好的方法來提取欠費資料,那就是將該段SQL指令碼寫成PostgreSQL過程語言,然後只需要執行自訂的函數就可以提取十天的欠費資料了,這樣大大的提高了自己的工作效率。
最後給出改進後的PostgreSQL過程語言函數以及postgresqlAPI的pdf檔案(中文版本額!):
最後給出改進後的PostgreSQL過程語言函數以及postgresqlAPI的pdf檔案(中文版本額!):
?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
函數名wx_qf_hdb(統計日期, 01508); 格式: wx_qf_hdb(20150901, 201508); 功能:提取目前欠費帳齡截止統計日期的各支局欠費回收總數 */ --start CREATE FUNCTION wx_qf_hdb(day_id numeric,acct_month numeric) RETURNS TEXT AS $$ DECLARE LS_SQL VARCHAR(5000); today VARCHAR(8); qf_month VARCHAR(6); month_l INTEGER; num numeric; BEGIN today := TRIM(to_char(day_id,99999999));--到期日轉為字串 qf_month := TRIM(to_char(acct_month,999999));--欠費月份轉為字串 num := to_number(substr(today,1,6),999999);--區字串的前6位 month_l := to_date(to_char(day_id+1, ‘9999-99-99‘ ), ‘yyyy-mm-dd‘ )-to_date(to_char(num, ‘9999-99‘ )|| ‘-01‘ , ‘yyyy-mm-dd‘ );--計算當月天數 FOR i IN 1..month_l LOOP LS_SQL := ‘create table temp_wuxi_qf‘ ||i|| ‘ as SELECT DISTINCT A.DAY_ID 統計日期 ,A.CHANNEL_NAME 支局名稱 ,A.OWE_MONTH 欠費賬期 ,SUM(B.current_charge) 日回收 FROM 表1A LEFT JOIN 表2 B ON A.SERV_ID=B.SERV_ID WHERE A.AREA_ID=27 AND B.mkt_area_ID=27 AND A.DAY_ID=‘ ||to_char(day_id-month_l+i,99999999)|| ‘ AND A.OWE_MONTH =‘ ||qf_month|| ‘ AND B.ACCT_MONTH=‘ ||qf_month|| ‘ GROUP BY A.DAY_ID,A.CHANNEL_NAME,A.OWE_MONTH‘ ; EXECUTE LS_SQL; END LOOP; --提取日資料 LS_SQL := ‘create table temp_wuxi_qf‘ ||qf_month|| ‘ as ‘ ; FOR i IN 1..month_l LOOP LS_SQL := LS_SQL|| ‘SELECT * FROM temp_wuxi_qf‘ ||i|| ‘ UNION ‘ ; END LOOP; LS_SQL := LS_SQL|| ‘SELECT * FROM temp_wuxi_qf‘ ||month_l; EXECUTE LS_SQL; --匯總日資料 FOR i IN 1..month_l LOOP LS_SQL:= ‘DROP TABLE temp_wuxi_qf‘ ||i; EXECUTE LS_SQL; END LOOP; --刪除所有暫存資料表 RETURN LS_SQL; END; $$ LANGUAGE plpgsql; --end select wx_qf_hdb(20150903,201508); --運行函數wx_qf_hdb(統計日期,欠費帳期) DROP FUNCTION wx_qf_hdb(day_id numeric,acct_month numeric); --刪除函數 select * from temp_wuxi_qf欠費帳期;--查詢表 drop table temp_wuxi_qf欠費帳期; -- 刪除表 |
http://pan.baidu.com/s/1mg09t5Q(PostgreSQLAPI檔案下載
有興趣的朋友可以自己試著去研究下PostgreSQL過程語言函數,真的對長期從事提取資料的朋友們協助很大
資料處理之PostgreSQL過程語言學習