首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从列表中插入随机数据

从列表中插入随机数据
EN

Stack Overflow用户
提问于 2020-07-29 01:26:44
回答 2查看 620关注 0票数 1

这些是我的表列:

代码语言:javascript
运行
复制
 ID || Date || Description || Priority

我的目标是插入2000行的随机测试数据,其日期范围为(7/1/2019-7/1/2020),并将列表中的优先级(高、中、低)随机化。

我知道如何插入随机数,但我被日期和优先级字段卡住了。

如果我需要编写代码,那么我应该如何编写代码呢?

只是想弄清楚--我对随机化和从给定列表中插入有问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-29 01:39:25

代码语言:javascript
运行
复制
CREATE TABLE mytable (
  id SERIAL PRIMARY KEY,
  date DATE NOT NULL,
  description TEXT,
  priority ENUM('High','Medium','Low') NOT NULL
);

INSERT INTO mytable (date, priority)
  SELECT '2019-07-01' + INTERVAL FLOOR(RAND()*365) DAY, 
      ELT(1+FLOOR(RAND()*3), 'High', 'Medium', 'Low') 
  FROM DUAL;

假表DUAL是一个特殊的关键字。您可以从中选择,并且它总是返回准确的一行。但是它没有包含数据的真实列,所以只能选择表达式。

执行此插入几次,您将得到:

代码语言:javascript
运行
复制
mysql> select * from mytable;                                                                                                                                       

+----+------------+-------------+----------+
| id | date       | description | priority |
+----+------------+-------------+----------+
|  1 | 2019-10-20 | NULL        | Medium   |
|  2 | 2020-05-17 | NULL        | High     |
|  3 | 2020-06-25 | NULL        | Low      |
|  4 | 2020-05-06 | NULL        | Medium   |
|  5 | 2019-09-30 | NULL        | High     |
|  6 | 2019-08-06 | NULL        | Low      |
|  7 | 2020-02-21 | NULL        | High     |
|  8 | 2019-11-10 | NULL        | High     |
|  9 | 2019-07-30 | NULL        | High     |
+----+------------+-------------+----------+

下面是一个技巧,使用表本身中的行数来插入相同的行数,基本上是行数的两倍:

代码语言:javascript
运行
复制
INSERT INTO mytable (date, priority)
  SELECT '2019-07-01' + INTERVAL FLOOR(RAND()*365) DAY, 
      ELT(1+FLOOR(RAND()*3), 'High', 'Medium', 'Low') 
  FROM mytable;

只需将FROM DUAL更改为FROM mytable,我就从选择一行改为从表中选择当前的行数。但是我插入的值仍然是随机表达式,而不是那些行中已经存在的值。所以我用新的随机值得到新的行。

然后,重复此插入尽可能多次,以使行数加倍。

还可以阅读有关ELT()函数的内容。

票数 1
EN

Stack Overflow用户

发布于 2020-07-29 01:29:41

你好像在找这样的东西。一个基本的随机抽样是:

代码语言:javascript
运行
复制
select t.*
from t
where date >= '2019-07-01' and date < '2020-07-01'
order by random()
fetch first 2000 rows only;

当然,random()的函数因数据库而异,限制行的逻辑也是如此。这应得到与原始数据大致相同的优先次序分布。

如果希望先按优先级排列行,请使用:

代码语言:javascript
运行
复制
select t.*
from t
where date >= '2019-07-01' and date < '2020-07-01'
order by (case when priority = 'High' then 1 when priority = 'Medium' then 2 else 3 end),
         random()
fetch first 2000 rows only;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63145007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档