Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于另一个表中的值在行中生成随机值_Sql_Postgresql_Mocking - Fatal编程技术网

Sql 基于另一个表中的值在行中生成随机值

Sql 基于另一个表中的值在行中生成随机值,sql,postgresql,mocking,Sql,Postgresql,Mocking,我想在表中创建大量模拟数据(在Postgresql中)。表的架构如下所示 price float, id id, period timestamptz 对于价格,这将是一个介于1-5之间的随机浮点数 对于id,这将是另一个表中的值,该表包含id列中的所有值(可能有很多id) 对于期间,这将在特定的时间范围内生成一个随机的日期时间值 在这里,我想创建一个查询,它可以生成所有这些行,这些行的数量等于我所选择的特定时间范围内的id数量 例如 假设我在另一个表中有3个ID(

我想在表中创建大量模拟数据(在Postgresql中)。表的架构如下所示

price     float,
id        id,
period    timestamptz
对于
价格
,这将是一个介于1-5之间的随机浮点数

对于
id
,这将是另一个表中的值,该表包含
id
列中的所有值(可能有很多id)

对于
期间
,这将在特定的时间范围内生成一个随机的日期时间值

在这里,我想创建一个查询,它可以生成所有这些行,这些行的数量等于我所选择的特定时间范围内的
id
数量

例如

假设我在另一个表中有3个ID(a、b、c),我想生成2019-08-01 00:00:00+00和2019-08-05 00:00:00+00之间的时间序列

此查询的结果将生成如下值:

price      id          period
3.4        b    2019-08-03 10:01:22+00
2.5        a    2019-08-04 05:44:31+00  
4.8        c    2019-08-04 14:51:10+00
价格和身份证是随机的。也有周期,但有特定的范围。关键是,需要生成所有ID

生成随机数和日期时间并不困难,但如何创建一个查询,根据从另一个表收集的所有id生成行


注:我编辑了可能误导我问题的示例

这回答了对原始问题的合理解释

从第二个表中获取随机值可能有点棘手。如果第二个表不太大,则此操作有效:

select distinct on (gs.ts) gs.ts, ids.id, cast(random() * 4.1 + 1 as numeric(2, 1))
from generate_series('2019-08-01 00:00:00+00'::timestamp, '2019-08-05 00:00:00+00'::timestamp, interval '30 minute') gs(ts) cross join
     ids
order by gs.ts, random()

使用函数make_timestamtz为每个部分生成一个随机整数,年和月除外。这将创建随机时间戳。至于从另一个表中获取id,只需从该表中选择

    /* 
     function to generate random integers. (Lots of then needed.)
    */ 
    create or replace function utl_gen_random_integer(
        int1_in integer,
        int2_in integer)
      returns integer 
      language sql volatile strict
      as
    $$
    /* return a random integer between, inclusively, two integers, relative values of the integers does not matter. */
       with ord as ( select greatest(int1_in, int2_in) as hi
                          , least(int1_in, int2_in) as low
                          )
       select floor(random()*(hi-low+1)+l)::integer from ord;
    $$; 

-- create the id source table and populate
create table id_source( id text) ;
insert into id_source( id) 
 with id_range as ( select 'abcdefgh'::text idl)
 select substring(idl,utl_gen_random_integer(1,length(idl)), 1)  
   from id_range, generate_series(1,20) ;
和生成查询:

select trunc((utl_gen_random_integer(1,4) + (utl_gen_random_integer(0,100))/100.0),2) Price 
     , id
     , make_timestamptz ( 2019                            -- year
                        , 08                              -- month 
                        , utl_gen_random_integer(1,5)     -- day 
                        , utl_gen_random_integer(1,24)-1  -- hours
                        , utl_gen_random_integer(1,60)-1  -- min                  
                        , (utl_gen_random_integer(1,60)-1)::float  -- sec 
                        , '+00'
                        )  

  from id_source;

结果生成UTC(+00)时的时间。但是,任何后续的Postgre都将显示转换为带有偏移量的本地时间的结果。要在UCT中查看,请在查询中附加“在时区‘UCT’”

您的答案将在特定时间范围内以30分钟的间隔生成所有行。因此,它会基于此生成大量行。但我所要求的只是生成x行,这些行具有不同的id(x是id的数量),并且具有该日期时间范围内的随机日期时间值。@Jamiewp。否。您要求“对于期间,这将根据特定的时间范围生成日期时间值。”。如果你有一个不同的问题,你应该把它作为一个新问题来问。哦,对不起,我的意思是生成包含在特定时间范围内的随机日期时间值。我的例子可能会误导你。我已经编辑了这个问题。