mysql 生成时间序列数据 - 存储过程
由于时间自动转换为int值, 做一步转化,也可在调用时处理
use `test`; CREATE table test.test1 as
SELECT state, id, `规格条码`,
`色号条码`,
`货号`,
`在售平台`,
`平台售价`,
DATE_ADD('1900-01-01', Interval data1.`上架时间` day) as `上架时间`,
`下架时间`,
`操作员`
FROM data1; CREATE table test.test2 as
SELECT state, id,
DATE_ADD('1900-01-01', Interval `时间` day) as `时间`,
`在售平台`,
`规格条码`,
`销量`,
`销售额`,
`撤销标志`
FROM data2;
生成时间序列数据
USE `test`;
DROP TABLE IF EXISTS tmptb;
CREATE TEMPORARY TABLE tmptb (
id INT UNSIGNED AUTO_INCREMENT,
date DATE NOT NULL,
shop VARCHAR(20) NOT NULL DEFAULT 0,
sales INT UNSIGNED DEFAULT 0,
PRIMARY KEY ( id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
DELIMITER //
DROP PROCEDURE IF EXISTS DayRangeProc//
CREATE PROCEDURE DayRangeProc ( IN start_date DATE, IN end_date DATE)
BEGIN
DECLARE i, range_day INT;
SET i = 0;
SET range_day = (SELECT DATEDIFF(end_date, start_date));
WHILE i <= range_day DO
INSERT INTO tmptb(date) VALUES (ADDDATE(start_date, i));
-- SET @sqlcmd = CONCAT('INSERT INTO ', tmptb, ' (date) VALUES (', temp, ')');
-- PREPARE stmt FROM @sqlcmd;
-- EXECUTE stmt;
-- DEALLOCATE PREPARE stmt;
SET i = i + 1;
END WHILE;
END;
// DELIMITER ;
CALL DayRangeProc ('2010-09-01', '2010-09-10');
SELECT * FROM tmptb;
从test1表与test2表,产生每个产品上架以来每天在每个平台的销售情况,如无销售数据则计销量为0
USE `test`;
DROP TABLE IF EXISTS result;
CREATE TABLE result (
-- 保存结果数据
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date DATE NOT NULL,
product_id VARCHAR(20) NOT NULL,
shop VARCHAR(20) NOT NULL DEFAULT 0,
price FLOAT NOT NULL,
sales INT(8) DEFAULT 0,
amount DOUBLE DEFAULT 0,
PRIMARY KEY ( id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS shop_name_tb;
CREATE TEMPORARY TABLE shop_name_tb AS (SELECT DISTINCT `在售平台` AS NAME FROM test2); -- 保存平台,类似于数组操作 DELIMITER //
DROP PROCEDURE IF EXISTS DayRangeProc//
CREATE PROCEDURE DayRangeProc()
BEGIN
DECLARE i, j, t INT;
DECLARE range_day INT;
DECLARE shop_num, prod_num INT;
DECLARE start_date, end_date DATE;
DECLARE prod_id, shop_name VARCHAR(20);
DECLARE price FLOAT; SET i = 0;
SET j = 0;
SET t = 0;
SET shop_num = (SELECT COUNT(*) FROM shop_name_tb);
SET prod_num = (SELECT COUNT(*) FROM test1);
SET end_date = (SELECT MAX(`时间`) FROM test2 ); -- 由于下架时间均为空,假设都在销
-- 产品循环
WHILE i <= prod_num DO
SET prod_id = (SELECT `规格条码` FROM test1 LIMIT i,1); -- 第i个商品名称
SET start_date = (SELECT `上架时间` FROM test1 WHERE `规格条码` = prod_id); -- 第i个商品的上架时间
SET range_day = (SELECT DATEDIFF(end_date, start_date)); -- 第i个商品累计销售天数,以便插入相应长度的数据 -- 平台循环
WHILE j <= shop_num DO
SET shop_name = (SELECT name FROM shop_name_tb LIMIT j,1); -- 店铺名称
SET price = (SELECT `平台售价` FROM test1 WHERE `规格条码` = prod_id); -- 第i个商品售价,假设不同平台售价相同 -- 时间循环
WHILE t <= range_day DO
INSERT INTO result(date, product_id, shop, price)
VALUES (ADDDATE(start_date, t), prod_id, shop_name, price); -- sales, amount
SET t = t + 1;
END WHILE; SET j = j + 1;
END WHILE;
SET i = i + 1;
END WHILE;
END;
// DELIMITER ;
CALL DayRangeProc (); -- 查询数据
SELECT
result.id,
result.date,
result.product_id,
result.shop,
result.price,
IF(ISNULL(test2.`销量`), result.sales, test2.`销量`) AS sales,
IF(ISNULL(test2.`销售额`), result.amount, test2.`销售额`) AS amount
FROM result LEFT JOIN test2
ON result.date = test2.`时间`
AND result.shop = test2.`在售平台`
AND result.product_id = test2.`规格条码`;
给定字符串,拆分后输出一列
USE test;
DROP TABLE IF EXISTS TEMP;
CREATE TABLE TEMP (
ID INT (8) NOT NULL AUTO_INCREMENT,
number VARCHAR(20) NOT NULL,
PRIMARY KEY (ID)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '测试'; DELIMITER $$
DROP PROCEDURE IF EXISTS `Pr_Rand_insert`$$
CREATE PROCEDURE `Pr_Rand_insert` ( IN insert_string VARCHAR (10000)) -- 定义输入
BEGIN
DECLARE I INT (8) DEFAULT 1 ;
DECLARE J INT (8) DEFAULT 0 ;
SET J = CHAR_LENGTH(insert_string) - CHAR_LENGTH( REPLACE (insert_string, ',', '')) + 1; -- 计算共有多少位为",",则再加上1就表示共有多少个数值需要插入
WHILE (I <= J) DO
INSERT INTO TEMP(number) VALUES (SUBSTRING_INDEX(SUBSTRING_INDEX(insert_string, ',', I), ',', - 1)) ; -- 用到了substring_index()函数
SET I = I + 1 ;
END WHILE ;
-- SELECT CONCAT('共插入了', J, '个值,请确认');
END$$
DELIMITER ; CALL Pr_Rand_insert ('231,24,1114,151,7831241,9134,989');
SELECT * FROM TEMP;
mysql 生成时间序列数据 - 存储过程的更多相关文章
- mysql 批量插入数据存储过程
create procedure pFastCreateNums (cnt int unsigned) begin declare s int unsigned default 1; truncate ...
- SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法
create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...
- 利用TPC-H为MYSQL生成数据
## 利用TPC-H为MYSQL生成数据 导言 这篇文章是看了joyee写的TPC-H数据导入MySQL教程以及另一篇网上的MySQL TPCH测试工具简要手册 后写的,有些内容是完全转载自以上两篇文 ...
- MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器
———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...
- python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原
###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...
- Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)
Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer Advanced Installer :Free for 30 da ...
- 提高MYSQL百万条数据的查询速度
提高MYSQL百万条数据的查询速度 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 nul ...
- mysql生成随机测试数据
一个demo: CREATE TABLE dept_InnoDB( deptno MEDIUMINT NOT NULL DEFAULT 0 , dname VARCHAR(20) NOT NULL ...
- mysql生成百万级数量测试数据
今天因为项目需要,想测试一下读取百万级数量数据的速度如何,无奈数据库没有现成符合要求的数据,网上百度一番有很都不错的文章,但是需要涉及到一些存储过程和用php代码什么的,虽说可以实现,但是感觉另外再弄 ...
随机推荐
- 第4次作业 -- 基于Jenkins的持续集成
Jenkins 配置使用心得 先在 https://jenkins.io/download/ 下载Jenkins 下载之后安装,在指定的地方找到了初始密码,安装了一些插件之后,Jenkins就可以使用 ...
- 构建--> 部署-->
这一篇中我们会写一些关于自动化部署的代码.我们会使用 Powershell 书写这类代码. 你将发现这篇文章中涉及的东西非常具体,有的要求甚至相当苛刻且可能不具有通用性.这是因为部署从来都是跟环境打交 ...
- Docker install GitLab
示范一下如何透过Docker安装GitLab,也顺便将一些常用的东西纪录一下 作业系统: CentOS 7 安装Docker CE 1. 先移除系统上预先安装的Docker旧版本 yum remove ...
- python中的lambda表达式
lambda是python中匿名函数的写法 我们可以在不定义函数名的情况下一边定义并调用这个函数 例子: 普通方法定义函数:def plus(a,b): return a+b lambda方法 ...
- 汉诺塔III
题目描述: 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动 ...
- linux虚拟机关机、重启命令
linux虚拟机关机.重启命令 一.shutdown 1.shutdown -h now :立即关机 2.shutdown -h 10:53:到10:53关机 3.shutdown -h +10 ...
- jdk环境变量配置改变不生效的问题
在工作中两次遇到jdk配置上的这个问题:将环境变量中的jdk路径修改之后,使用-version查看,版本号还是之前的,也就是说修改未生效.甚至当我将Path变量中的jdk路径配置都删除了之后,使用-v ...
- python爬虫教程实践1——安装scrapy
系统:macOS Sierra 10.12.6 python版本:3.6 1.安装homebrew(以前的环境配置中有介绍过) 官网:http://brew.sh/index_zh-cn.html 2 ...
- JavaScript Node节点笔记
1. 节点及其类型: 1). 元素节点 2). 属性节点: 元素的属性, 可以直接通过属性的方式来操作. 3). 文本节点: 是元素节点的子节点, 其内容为文本. 2. 在 html 文档的什么位置编 ...
- Android Studio 入口程序的设置方法
在src -> main中 ,打开 AndroidManifest.xml 这个文件 下面这里有两个窗口,如果要想把哪个窗口设置成入口窗体,只要把下面红色的放在这个节点中就可以了 <act ...