这些是我的表列:
ID || Date || Description || Priority我的目标是插入2000行的随机测试数据,其日期范围为(7/1/2019-7/1/2020),并将列表中的优先级(高、中、低)随机化。
我知道如何插入随机数,但我被日期和优先级字段卡住了。
如果我需要编写代码,那么我应该如何编写代码呢?
只是想弄清楚--我对随机化和从给定列表中插入有问题。
发布于 2020-07-29 01:39:25
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是一个特殊的关键字。您可以从中选择,并且它总是返回准确的一行。但是它没有包含数据的真实列,所以只能选择表达式。
执行此插入几次,您将得到:
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 |
+----+------------+-------------+----------+下面是一个技巧,使用表本身中的行数来插入相同的行数,基本上是行数的两倍:
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()函数的内容。
发布于 2020-07-29 01:29:41
你好像在找这样的东西。一个基本的随机抽样是:
select t.*
from t
where date >= '2019-07-01' and date < '2020-07-01'
order by random()
fetch first 2000 rows only;当然,random()的函数因数据库而异,限制行的逻辑也是如此。这应得到与原始数据大致相同的优先次序分布。
如果希望先按优先级排列行,请使用:
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;https://stackoverflow.com/questions/63145007
复制相似问题