`
lovejuan1314
  • 浏览: 342903 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PL/PgSQL 从大表数据抽取统计数据

EXT 
阅读更多

--Extract Data from views to stats table v2.0
CREATE OR REPLACE FUNCTION (IN endTs TIMESTAMP,IN tab_name VARCHAR) RETURNS VARCHAR AS $$
DECLARE
 t_res       		   		VARCHAR;
 t_endTs	 		   		TIMESTAMP;
 t_startTs   		   		TIMESTAMP;
 t_imprs_country_stats_dt   TIMESTAMP;
 t_imprs_stats_dt			TIMESTAMP;
 t_imprs_audit_id           BIGINT;
 t_rec_views 				views%ROWTYPE;
 t_rec_imprs_country_stats  RECORD;
 t_rec_imprs_stats 			RECORD;
 t_rec_audit 				s_ext_stats_audit%ROWTYPE;
 t_tabName   				VARCHAR;
 -------Define id variable for saving the s_ads_imprs_country_stats primary id
 v_rec_imprs_country_stats_id BIGINT;
 -------Define id variable for saving the s_ads_imprs_stats primary id
v_rec_imprs_stats_id 		BIGINT; 

BEGIN
	t_tabName := tab_name;
	--- Define the function return chars 
	t_res := 'Ok. It is successfull to extract data.';
	--- Check views_audit table whether contains data
	SELECT * INTO t_rec_audit FROM s_ext_stats_audit ORDER BY id DESC LIMIT 1;
	------ Get the audit table primary key id
	t_imprs_audit_id := t_rec_audit.views_pid;
	-------Get the start time from audit table 
	t_startTs := t_rec_audit.views_cdt;
	-------Get the end time from audit table
	t_endTs := endTs;
	RAISE NOTICE 'The start time is %',t_startTs;
	RAISE NOTICE 'The end time is %',t_endTs;
	-------The loop for getting ads impressions country stats data
	FOR t_rec_imprs_country_stats IN EXECUTE 'SELECT ad_id,COALESCE(country,''OTHER'') AS country,SUM(impressions) AS impressions,dates,source  FROM '||
		'(((SELECT DISTINCT(DATE_TRUNC(''DAY'',a.crdate)) AS dates,b.ad_id,a.client_ip,COUNT(a.fb_uid) AS impressions, 0 AS source FROM '||t_tabname||
		' a,ads b WHERE a.ad_id = b.id '||'AND a.id > '||t_imprs_audit_id||' AND a.crdate > '''||t_startTs||''' AND a.crdate < '''||t_endTs||
			''' AND a.fb_uid IS NOT NULL GROUP BY b.ad_id,a.client_ip,dates ORDER BY b.ad_id)'||
		' UNION ALL '||
		'(SELECT DISTINCT(DATE_TRUNC(''DAY'',a.crdate)) AS dates,b.ad_id,a.client_ip,COUNT(a.bebo_uid) AS impressions, 1 AS source FROM '||t_tabname||
			' a,ads b WHERE a.ad_id = b.id 	AND a.id > '||t_imprs_audit_id||' AND a.crdate > '''||t_startTs||''' AND a.crdate < '''||t_endTs||
			''' AND a.bebo_uid IS NOT NULL GROUP BY b.ad_id,a.client_ip,dates ORDER BY b.ad_id)'||
		' UNION ALL '||
		'(SELECT DISTINCT(DATE_TRUNC(''DAY'',a.crdate)) AS dates,b.ad_id,a.client_ip,COUNT(a.ms_uid) AS impressions, 2 AS source FROM '||t_tabname||
			' a,ads b WHERE a.ad_id = b.id 	AND a.id > '||t_imprs_audit_id||' AND a.crdate > '''||t_startTs||''' AND a.crdate < '''||t_endTs||
			''' AND a.ms_uid IS NOT NULL GROUP BY b.ad_id,a.client_ip,dates ORDER BY b.ad_id)'||
		' UNION ALL '||
		'(SELECT DISTINCT(DATE_TRUNC(''DAY'',a.crdate)) AS dates,b.ad_id,a.client_ip,COUNT(a.hi5_uid) AS impressions, 3 AS source FROM '||t_tabname||
			' a,ads b WHERE a.ad_id = b.id 	AND a.id > '||t_imprs_audit_id||' AND a.crdate > '''||t_startTs||''' AND a.crdate < '''||t_endTs||
			''' AND a.hi5_uid IS NOT NULL GROUP BY b.ad_id,a.client_ip,dates ORDER BY b.ad_id)) '||
		' AS tmp_ads_imprs_country_stats '||
		' LEFT JOIN geoip G ON ip4(tmp_ads_imprs_country_stats.client_ip) <<= G.network '||
		' LEFT JOIN geoip_location AS geoip_loc ON G.location_id = geoip_loc.id ) AS tmp_ads_imprs_country_stats_t '||
		' GROUP BY ad_id,country,dates,source'
		LOOP
			SELECT id INTO v_rec_imprs_country_stats_id FROM s_ads_imprs_country_stats WHERE ad_id = t_rec_imprs_country_stats.ad_id 
				AND country = t_rec_imprs_country_stats.country AND crdate = t_rec_imprs_country_stats.dates AND data_platform = t_rec_imprs_country_stats.source;
			RAISE NOTICE 't_rec_imprs_country_stats.crdate is %',t_rec_imprs_country_stats.dates;
			IF NOT FOUND THEN
				INSERT INTO s_ads_imprs_country_stats (crdate,ad_id,country,impressions,data_platform) VALUES (t_rec_imprs_country_stats.dates
								,t_rec_imprs_country_stats.ad_id,t_rec_imprs_country_stats.country,t_rec_imprs_country_stats.impressions,t_rec_imprs_country_stats.source);
			ELSE
				UPDATE s_ads_imprs_country_stats SET impressions = impressions + t_rec_imprs_country_stats.impressions WHERE id = v_rec_imprs_country_stats_id;
			END IF;	
	END LOOP;
	
	--- The loop for getting ads impressions stats data
	FOR t_rec_imprs_stats IN EXECUTE 'SELECT *  FROM'||
		'((SELECT DISTINCT(DATE_TRUNC(''DAY'',a.crdate)) AS dates,b.ad_id,COUNT(a.fb_uid) AS impressions, 0 AS data_platform FROM '||t_tabname||
			' a,ads b WHERE a.ad_id = b.id AND a.id > '||t_imprs_audit_id||' AND a.crdate > '''||t_startTs||''' AND a.crdate < '''||t_endTs||
			''' AND a.fb_uid IS NOT NULL GROUP BY b.ad_id,dates ORDER BY b.ad_id)'||
		' UNION ALL '||
		'(SELECT DISTINCT(DATE_TRUNC(''DAY'',a.crdate)) AS dates,b.ad_id,COUNT(a.bebo_uid) AS impressions, 1 AS data_platform FROM '||t_tabname||
			' a,ads b WHERE a.ad_id = b.id AND a.id > '||t_imprs_audit_id||' AND a.crdate > '''||t_startTs||''' AND a.crdate < '''||t_endTs||
			''' AND a.bebo_uid IS NOT NULL GROUP BY b.ad_id,dates ORDER BY b.ad_id)'||
		' UNION ALL '||
		'(SELECT DISTINCT(DATE_TRUNC(''DAY'',a.crdate)) AS dates,b.ad_id,COUNT(a.ms_uid) AS impressions, 2 AS data_platform FROM '||t_tabname||
			' a,ads b WHERE a.ad_id = b.id AND a.id > '||t_imprs_audit_id||' AND a.crdate > '''||t_startTs||''' AND a.crdate < '''||t_endTs||
			''' AND a.ms_uid IS NOT NULL GROUP BY b.ad_id,dates ORDER BY b.ad_id)'||
		' UNION ALL '||
		'(SELECT DISTINCT(DATE_TRUNC(''DAY'',a.crdate)) AS dates,b.ad_id,COUNT(a.hi5_uid) AS impressions, 3 AS data_platform FROM '||t_tabname||
			' a,ads b WHERE a.ad_id = b.id AND a.id > '||t_imprs_audit_id||' AND a.crdate > '''||t_startTs||''' AND a.crdate < '''||t_endTs||
			''' AND a.hi5_uid IS NOT NULL GROUP BY b.ad_id,dates ORDER BY b.ad_id))'||
		' AS tmp_ads_imprs_stats'
	LOOP
			SELECT id INTO v_rec_imprs_stats_id FROM s_ads_imprs_stats WHERE ad_id = t_rec_imprs_stats.ad_id 
				AND crdate = t_rec_imprs_stats.dates AND data_platform = t_rec_imprs_stats.data_platform;
			
			IF NOT FOUND THEN
				INSERT INTO s_ads_imprs_stats (crdate,ad_id,impressions,data_platform) VALUES (t_rec_imprs_stats.dates
								,t_rec_imprs_stats.ad_id,t_rec_imprs_stats.impressions,t_rec_imprs_stats.data_platform);
			ELSE
				UPDATE s_ads_imprs_stats SET impressions = impressions + t_rec_imprs_country_stats.impressions WHERE id = v_rec_imprs_stats_id;
			END IF;	
	END LOOP;
	
	--- To insert the latest data into audit table, that means which data will be extracted and where it is from
		
	EXECUTE 'INSERT INTO s_ext_stats_audit (views_pid,views_cdt,opr_dt) SELECT id,crdate,now() FROM '||t_tabName||' WHERE crdate >= '''||t_startTs||
				''' and crdate <'''|| t_endTs||''' ORDER BY id DESC LIMIT 1';	
				
	RETURN t_res;

	RAISE EXCEPTION 'It is failed.';
END;
$$ LANGUAGE plpgsql;



分享到:
评论
1 楼 martri 2008-10-31  
分步抽取麽?

相关推荐

    简述PL/PGSQL的结构

    在 PL/PGSQL 中,所有关键字和标识符都可以用混和大小写的方式来写。标识符被隐含地转换成小写字符,除非被双引号包围。PL/pgSQL 支持两种类型的注释,一种是双破折号(--) 引出一个扩展到该行结尾的注释,另一种是...

    PL/pgSQL从入门到放弃(1)-入门

    PL/pgSQL介绍 PL/pgSQL是一种用于PostgreSQL数据库系统的可载入的过程语言。 可以被用来创建函数和触发器过程 对SQL语言增加控制结构 可以执行复杂计算 继承所有用户定义类型、函数和操作符 可以被定义为受服务器...

    PL/pgSQL从入门到放弃(5)-条件语句与循环语句

    PL/pgSQL从入门到放弃(2)-变量定义与数据类型 PL/pgSQL从入门到放弃(3)-函数 PL/pgSQL从入门到放弃(4)-函数返回各种常用数据类型 PL/pgSQL从入门到放弃(5)-条件语句与循环语句 PL/pgSQL从入门到放弃(6)-游标 条件...

    PostgreSQL教程(二十):PL/pgSQL过程语言

    总结来说,PL/pgSQL是PostgreSQL中一个强大的工具,它提供了丰富的编程元素,使得数据库管理员和开发者能够更高效地处理数据和实现复杂的业务逻辑。理解和熟练运用PL/pgSQL能够显著提升PostgreSQL应用的性能和可维护...

    PostgreSQL 数据库集群和PL/Proxy配置安装指南PL/Proxy和PostgreSQL集群的结构关系可以用下图清楚地表示,对PL/Proxy和PostgreSQL集群还不太了解的朋友可以看Skype Plans for PostgreSQL to Scale to 1 Billion Users这篇文章。

    PL/Proxy 支持基于表、函数等多种维度的路由策略,可以根据实际业务需求灵活配置,极大提高了数据库集群的可扩展性和可用性。 #### 三、部署环境与硬件配置 本指南基于以下环境进行部署: - **plproxy 节点**: ...

    JSQLEditor PL/SQL and PL/pgSQL Plug-in-开源

    JSQLEditor是一款专为Eclipse集成开发环境(IDE)设计的PL/SQL和PL/pgSQL编辑器插件,旨在提升数据库脚本编写和管理的效率。作为一个开源项目,它鼓励用户参与贡献,促进社区的发展,同时提供了免费的、高质量的编程...

    tsql2pgsql:帮助那些将存储过程从 TSQL (SQL Server) 转换为 PLPGSQL (Postgresql) 的工具

    tsql2pgsql是一款非常实用的工具,主要用于帮助数据库管理员和开发者将TSQL(SQL Server的存储过程语言)转换为PL/PGSQL(PostgreSQL的存储过程语言)。在SQL Server和PostgreSQL之间进行迁移时,这个工具能显著减轻...

    使用PLSQL编写存储过程访问数据库.doc

    PL/SQL是Oracle数据库的...- 如何通过存储过程对数据库进行复杂的数据统计和分析。 此实验对于理解和掌握数据库编程,特别是PL/SQL语言的应用具有重要意义,它帮助我们更高效地管理和维护数据库,提高数据处理的效率。

    3D城市数据库-开源CityGML数据库_PLpgSQL_PLSQL_下载.zip

    例如,你可以用PL/pgSQL来实现CityGML数据的导入导出,或者进行空间查询,如查找某个区域内所有超过一定高度的建筑物。 PL/SQL则是Oracle数据库系统中的过程化语言,尽管本项目主要基于PostgreSQL,但理解PL/SQL的...

    PostgreSQL入门学习手册

    总之,PL/pgSQL为PostgreSQL用户提供了强大的工具集,用于实现复杂的业务逻辑和数据处理流程。通过深入了解PL/pgSQL的执行机制、结构特性以及事务管理策略,开发者可以充分利用其优势,构建高效、健壮的数据库应用...

    PL/sh扩展库(MIPS64)

    PostgreSQL是一种强大的开源关系型数据库管理系统,它支持多种编程语言来编写存储过程,包括SQL、PL/pgSQL、C等,而PL/sh则提供了使用Shell脚本语言的能力。这种灵活性使得数据库管理员和开发人员能够利用Unix或...

    Postgesql服务器端编程

    - PL/pgSQL函数可以通过参数访问数据,执行条件判断和循环处理,并且可以在函数执行完毕后进行特定的操作。 4. 返回结构数据: - PostgreSQL允许返回集合和数组类型的数据。 - 函数可以返回一个整数集合或利用...

    PostgreSQL9.3 DBA最佳实战培训PPT 580页

    - 自定义函数与类型:编写PL/pgSQL函数,定义自定义数据类型。 **8. 故障排查与维护** - 错误处理:学习识别和解决常见的错误和异常。 - 日志分析:理解日志系统,如何设置和分析日志以进行问题定位。 **9. ...

    从pgsql 数据库导出数据字典

    在PostgreSQL(pgsql)这样的关系型数据库管理系统中,数据字典通常是指一系列元数据,这些元数据描述了数据库的结构、对象以及它们之间的关系。本篇文章将详细探讨如何从PostgreSQL数据库导出数据字典,以及为何这...

    Discuz(论坛) GBK简体中文版(PHP+MySQL/PgSQL)

    一个通用的论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能力和可高度定制的论坛服务,采用世界上最流行的 web 编程组合 PHP+MySQL/PgSQL 实现,...

    navicat12绿色硬盘版连接Oralce/Mysql/PgSql

    用户可以通过Navicat12创建、编辑、运行SQL语句,管理表、视图、序列等数据库对象,进行数据导入导出,以及设置数据同步和备份任务。 对于MySQL,Navicat12提供了全面的MySQL管理和开发工具,支持最新的MySQL 8.0...

    postgresql集群

    sudo -u postgres /home/y/pgsql/bin/pg_ctl start -D /home/y/pgsql/dbdata -m fast & ``` ##### 5.4 创建数据库实例 ```bash sudo -u postgres /home/y/pgsql/bin/createdb URTCluster ``` ##### 5.5 配置...

    PostgreSQL的工业实力、可扩展作业队列_PLpgSQL_下载.zip

    例如,你可以创建一个"job_queue"表,用来存储待执行的任务信息,然后编写一个PL/pgSQL函数,该函数会轮询这个表并执行找到的任务。 在"pg_titanides-master"这个文件夹中,可能包含了关于如何利用PostgreSQL和PL/...

    Linux系统pgsql安装

    最后,在主库中创建一张表并在其中插入数据,然后在从机上检查该表是否同步成功。 以上步骤详细介绍了如何在Linux系统中安装PostgreSQL以及如何搭建主从复制环境。通过这些步骤,不仅可以成功部署PostgreSQL数据库...

Global site tag (gtag.js) - Google Analytics