zoukankan      html  css  js  c++  java
  • 数据处理之PostgreSQL过程语言学习

    前段时间,公司更换新的PostgreSQL数据集市的系统过程中,自己下载了postgresqlAPI的pdf文件研究了一下PostgreSQL数据集市。发现使用PostgreSQL过程语言可以大大加快自己处理数据的效率,下面就举个例子吧!相信大家看了后,也会喜欢上PostgreSQL过程语言的.......

    首先给出一段SQL脚本,该SQL查询2015年9月10日的欠费数据:



    1
    2
    3
    4
    5
    6
    7
    8
    9
    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文件(中文版本额!):



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    函数名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过程语言函数,真的对长期从事提取数据的朋友们帮助很大

     
  • 相关阅读:
    编程日志 Vue-element-admin
    JS判断全屏,Jquery绑定动态元素Parent元素单击事件
    查询所有表内容-SQL
    正则分割获取字符串中的数字部分(包括连续数字)(连续数字的分割获取)
    nginx本地正常访问,外网无法访问
    nuget 配置无效
    URL获取上级目录
    VS 调试项目运行不发布,允许其他网内直接访问
    小数(decimal,double) 截取两位或多位,不四舍五入
    Linq简单语句记录
  • 原文地址:https://www.cnblogs.com/CQ-LQJ/p/4910040.html
Copyright © 2011-2022 走看看