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代码什么的,虽说可以实现,但是感觉另外再弄 ...
随机推荐
- vue-baidu-map 的简单使用
首先附上vue-baidu-map 文档地址: https://dafrok.github.io/vue-baidu-map/#/zh/index 1.安装,初步使用,文档说的都很明白,就不在过多重复 ...
- python3读取sqlyog配置文件中的MySql密码
这个人有什么目的?: 我多多少少听过一些安全圈的大牛说到类似的思路,大意是可以通过扫描各种程序和服务的配置文件(比如SVN的文件,RSYNC的配置文件等), 从中发现敏感信息,从而找到入侵的突破口.沿 ...
- 深圳奥特迅现金流量——RESSET数据库
现金流不好,很多年都是负数.到公司官方网站上收集信息,拳头产品有矩阵柔性充电堆,主要盈利产品有电源和电源管理系统.还承担了深圳市的充电桩交钥匙项目. 下面是它这些年的股价,在大牛市的时候也上升至五十几 ...
- 2018.12.02 Socket编程之初识Socket
Socket编程主要分为TCP/UDP/SCTP三种,每一种都有各自的优点,所以会根据实际情况决定选用何种Socket,今天开始我将会逐步学习Socket编程,并将学习过程记录于此. 今天学习的是TC ...
- VS2010 配置与调试
一.VS2010项目属性配置 使用VS调试程序,出现错误:"无法启动程序"***\**.exe".系统找不到指定的文件".网上找来解决办法, 也未能解决,但这些 ...
- JS 最简单数组去重
,,,,])) // 再把set转变成array console.log(newArr) // [1,2,3,4]
- Docker入门教程
一.入门介绍 Docker是一个开源引擎,类似于一个集装箱,开发者通过它可以为任何应用创建一个轻量级.环境无关可移植的容器.开发者在本地编译测试过的容器可以在不同的环境中部署. 通常适用于如下场景: ...
- Selenium-java测试环境搭建
1.1背景 Selenium也是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Mozilla ...
- 微信小程序:首页设置方法(开发模式,使用模式)与其他相关设置
小程序开发并不愉快,许多必建的文件不会自动生成,页面之间的跳转没有快捷键,开发者工具显示区域受限……如果谁有对应的解决办法求告知…… 开始的时候每次保存代码,页面都会刷洗重新渲染一次,而且自动跳回首页 ...
- OVS常用命令与使用总结
说明 在平时使用ovs中,经常用到的ovs命令,参数,与举例总结,持续更新中… 进程启动 1.先准备ovs的工作目录,数据库存储路径等 mkdir -p /etc/openvswitch mkdir ...