根据项目报表需求,需要统计通过手机app登录系统的用户的日存留率。统计功能比较简单,仅作日后参考,欢迎经验丰富的朋友指点。
1.数据库表
手机用户的信息保存在一张visitor_user的表中,其中包含了用户使用手机app软件时,可以获取的数据,包括: 商家id、手机设备号、下线时间等信息。
2.功能分析与设计
数据统计报表一般都采用DB的存储过程或函数进行统计,并将数据保存到数据库表中,提供前台应用查询和展示。对于实时性的报表需求,建议在非业务库上进行统计。一般主库对外提供业务服务,通过复制等机制将业务数据存储到专门的数据库,或者专门的物理节点上,这样就有效的避免了报表统计功能对正常业务的影响。
3.实现
1.首先,从用户日统计表中将前天的登录用户统计到存留明细表中。
2.然后,从用户日统计表中将昨天的登录用户统计出来,并将前天、昨天都登录的用户的存留状态设置为1。
3.然后,从存留明细表中统计昨天用户的存留数、存留率,并保存到存留表中。
执行统计采用了mysql的事件机制,定时触发调用统计函数,进行数据统计。
每天凌晨4点钟,开始统计昨天的日存留率。
event:
表结构:
1.report_user_login_day_detail (日登陆用户流水表)
CREATE TABLE `report_user_login_day_detail` (
`id` varchar(36) NOT NULL COMMENT '主键(参照:select UUID())',
`shop_id` int(11) DEFAULT NULL COMMENT '餐厅id',
`day_time` date DEFAULT NULL COMMENT '日期(例如:2013-07-10)',
`device` varchar(50) DEFAULT NULL COMMENT '设备号',
`a_token` char(64) DEFAULT NULL COMMENT '用于与苹果服务器会话',
`off_time` datetime DEFAULT NULL,
`s_token` varchar(64) DEFAULT NULL COMMENT '与点菜网服务器会话',
`login_times` int(11) DEFAULT NULL COMMENT '登录次数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. report_user_remain_day_detail (日存留用户流水表)
CREATE TABLE `report_user_remain_day_detail` (
`id` varchar(36) NOT NULL COMMENT '主键(参照:select UUID())',
`shop_id` int(11) DEFAULT NULL COMMENT '餐厅id',
`day_time` date DEFAULT NULL COMMENT '统计日期(2013-07-12)',
`device` varchar(50) DEFAULT NULL COMMENT '设备号',
`a_token` char(64) DEFAULT '-1' COMMENT '用于与苹果服务器会话',
`off_time` datetime DEFAULT NULL,
`s_token` varchar(64) DEFAULT NULL COMMENT '与点菜网服务器会话',
`status_remain` tinyint(1) DEFAULT NULL COMMENT '是否日留存用户(0:非日留存;1:日留存)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3. report_user_remain_day (日存留用户统计表)
CREATE TABLE `report_user_remain_day` (
`id` varchar(36) NOT NULL COMMENT '主键(参照:select UUID())',
`day_time` date DEFAULT NULL COMMENT '日期(2013-07-12)',
`remain_count` int(11) DEFAULT '0' COMMENT '日存留数量',
`remain_percent_day` double(4,2) DEFAULT '0.00' COMMENT '日存留率',
`type_client` tinyint(1) DEFAULT '0' COMMENT '客户端类型(0:食客app;1:老板app)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
存储函数:
BEGIN
#Routine body goes here...
DECLARE _yesterday DATE DEFAULT NULL;
DECLARE _before_yesterday DATE DEFAULT NULL;
DECLARE _is_success tinyint(1) DEFAULT 0;
select DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-%d'),INTERVAL 1 day) INTO _yesterday;
select DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-%d'),INTERVAL 2 day) INTO _before_yesterday;
#统计前天用户数,并将前天用户插入到report_user_remain_day_detail表中
SET _is_success = get_user_remain_day(_before_yesterday);
#查询report_user_login_day_detail,统计昨天的用户,并将前天和昨天都登录的用户状态设置为1
SET _is_success = update_user_status_remain(_yesterday);
#统计存留用户明细表,将统计数据存储到统计表report_user_remain_day
SET _is_success = insert_user_remain_day(_yesterday);
RETURN _is_success;
END
CREATE FUNCTION `get_user_remain_day`(`_day_time` date) RETURNS int(1)
BEGIN
#Routine body goes here...
DECLARE stopFlag INT DEFAULT 0 ;
DECLARE _device VARCHAR(50) DEFAULT NULL;
DECLARE _a_token CHAR(64) DEFAULT '-1';
DECLARE _day_time date;
DECLARE _shop_id INT(11) DEFAULT 0;
#查询当天的登录用户
DECLARE cur1 CURSOR FOR select shop_id, device, a_token from report_user_login_day_detail WHERE day_time = _day_time;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopFlag=1;
OPEN cur1;
FETCH cur1 INTO _shop_id, _device, _a_token;
WHILE stopFlag = 0 do
INSERT INTO report_user_remain_day_detail(id, shop_id, day_time, device, a_token)
values (UUID(), _shop_id, _day_time, _device, _a_token);
FETCH cur1 INTO _shop_id, _device, _a_token;
END WHILE;
CLOSE cur1;
RETURN 1;
END
CREATE FUNCTION `update_user_status_remain`(`_day_time` date) RETURNS tinyint(1)
BEGIN
#Routine body goes here...
DECLARE stopFlag INT DEFAULT 0 ;
DECLARE _device VARCHAR(50) DEFAULT NULL;
DECLARE _a_token CHAR(64) DEFAULT '-1';
#查询昨天的登录用户
DECLARE cur1 CURSOR FOR select device, a_token from report_user_login_day_detail
WHERE day_time = _day_time;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopFlag=1;
OPEN cur1;
FETCH cur1 INTO _device, _a_token;
WHILE stopFlag = 0 do
UPDATE report_user_remain_day_detail SET status_remain = 1, day_time = _day_time
WHERE device = _device;
FETCH cur1 INTO _device, _a_token;
END WHILE;
CLOSE cur1;
RETURN 1;
END
CREATE FUNCTION `insert_user_remain_day`(`_day_time` date) RETURNS tinyint(1)
BEGIN
#Routine body goes here...
DECLARE stopFlag INT DEFAULT 0 ;
DECLARE _status_remain TINYINT(1);
DECLARE _remain_count INT DEFAULT 0;
DECLARE _all_count INT DEFAULT 0;
DECLARE _temp_count INT DEFAULT 0;
DECLARE cur2 CURSOR FOR SELECT status_remain, count(device) FROM report_user_remain_day_detail
WHERE status_remain = 1 and day_time = _day_time GROUP BY status_remain;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopFlag=1;
OPEN cur2;
FETCH cur2 INTO _status_remain, _remain_count;
WHILE stopFlag = 0 do
IF _status_remain = 1 THEN
SET _temp_count = _remain_count;
SET _all_count = _all_count + _remain_count;
ELSE
SET _all_count = _all_count + _remain_count;
END IF;
INSERT INTO report_user_remain_day(id, day_time, remain_count, remain_percent_day, type_client)
VALUES(UUID(), _day_time, _temp_count, (_temp_count / _all_count), 0);
FETCH cur2 INTO _status_remain, _remain_count;
END WHILE;
CLOSE cur2;
RETURN 1;
END
- 大小: 16.8 KB
分享到:
相关推荐
MySQL是世界上最流行的开源关系型数据库管理系统之一,而`mysql-connector-java`是MySQL官方提供的用于Java应用程序连接到MySQL服务器的驱动程序。`mysql-connector-java-5.1.27.jar`是这个驱动的一个特定版本,它...
mysql-connector-java-5.1.7-bin.jar
MySQL驱动jar包,即`mysql-connector-java`,是MySQL数据库与Java应用程序之间通信的关键组件。这个jar包包含了Java编程语言所需的类库,使得开发者能够通过JDBC(Java Database Connectivity)接口连接到MySQL...
`mysql-connector-java-5.1.47.jar`是这个驱动程序的特定版本,发布于MySQL的5.1系列,它提供了与MySQL 5.1数据库版本兼容的连接功能。 **JDBC(Java Database Connectivity)** JDBC是Java平台上的标准API,由Sun ...
MySQL-connector-java-8.0.28 是MySQL数据库与Java应用程序之间通信的重要组件,它是一个JDBC(Java Database Connectivity)驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。在这个版本中,...
在本场景中,`mysql-udf-http` 是一个特殊的 UDF 库,它为 MySQL 提供了通过 HTTP 协议进行数据交互的功能。由于许多在线资源的链接指向 Google,这可能在中国大陆地区访问受限,因此有人在 CSDN 上分享了这个库,以...
`mysql-connector-java-8.0.11.jar`适用于较新的MySQL环境,`mysql-connector-java-5.1.7-bin.jar`满足了对老版本MySQL的兼容需求,而`ojdbc14-10.2.0.1.0.jar`则服务于Oracle 10g数据库。在Java开发中,理解如何...
4. 聚合函数:SUM()用于求和,AVG()计算平均值,COUNT()统计行数,MAX()和MIN()找出最大值和最小值。 5. 控制流程函数:IF()和CASE语句用于条件判断,LOOP和WHILE用于循环结构。 其次,MySQL的常用命令是数据库管理...
mysql驱动包 mysql-connector-java-5.1.13-bin.jar 方便快捷获取。。。
5.6.20 最新JDBC mysql-connector-java-5.1.32-bin.jar
"mysql-connector-java-5.1.40.tar.gz" 是这个驱动程序的一个特定版本,版本号为5.1.40。这个压缩包包含了运行Java应用与MySQL数据库进行交互所需的类库和其他相关文件。 在Linux环境中处理这个压缩包,首先需要将...
在这个"mysql-connector-java-8.0.11"压缩包中,包含的是MySQL官方发布的针对Java的最新版本连接器,版本号为8.0.11。 1. **JDBC接口**:JDBC是Java语言访问数据库的标准接口,由Java SE的java.sql包提供。它定义了...
本文将详细讨论“mysql-installer-community-8.0.26.0.msi”文件,这是MySQL为Windows操作系统提供的安装程序,兼容32位和64位系统。 **MySQL Installer Community** MySQL Installer Community是MySQL公司提供的一...
此外,`mysql-connector-java-5.1.25.jar`还包含了对MySQL特定特性的支持,如存储过程、触发器、视图、用户定义函数(UDF)等。它还支持MySQL的一些高级功能,如分区表、复制、InnoDB事务隔离级别等。 值得注意的是,...
6. **安装与配置**:使用 "mysql-udf-http" 需要先将其编译为动态链接库,然后在 MySQL 中安装和注册这些函数。这通常涉及到修改 MySQL 的配置文件,以及使用 `INSTALL PLUGIN` SQL 命令。 7. **安全性与性能**:...
本资源提供的"mysql-connector-java-8.0.31-jar包"正是这样一个驱动程序的最新版本,即8.0.31。 MySQL Connector/J 8.0.31版本包含了对MySQL 8.x系列数据库的全面支持,提供了许多新特性和改进。以下是一些关键知识...
这个"mysql-connector-java-5.1.45-bin.jar"文件是该驱动的一个特定版本,即5.1.45版。这个版本是纯净且正版的,适合于Java开发者在他们的项目中直接集成使用。 在Java编程中,为了连接到MySQL数据库,我们需要一个...
mysql-connector-java-8.0.11.jar连接器,用于在hive和mysql的数据库连接
将要使用的是mysql-connector-java-5.1.30-bin-g.jar和mysql-connector-java-5.1.30-bin.jar 配置 在C:\Program Files\Java目录下建立mysqlforjdbc子目录,进入该目录将mysql-connector-java-5.1.30-bin.jar到该...
标题中的"mysql-connector-java-5.1.22-bin.jar"正是这个驱动程序的一个特定版本,5.1.22是其发行版本号。 MySQL Connector/J的工作原理基于JDBC规范,它提供了一系列的Java类和接口,这些类和接口与MySQL服务器...