【问题标题】:Use fixed list as random values in SQL query在 SQL 查询中使用固定列表作为随机值
【发布时间】:2021-10-17 13:56:24
【问题描述】:

我有一张表,我想在其中生成测试数据:

INSERT into onboarding_tasks (business_name, created_at, status)
SELECT
    'Business name ' || id AS business_name,
    (NOW() + (random() * (NOW() + '90 days' - NOW())) + '30 days') AS created_at,
    /* here I can have values NEW, IN_PROGRESS, COMPLETED */ AS status,    
FROM generate_series(1,25) as g(id);

您知道我如何在 SQL 查询中实现逻辑以从固定选项生成随机值吗?

【问题讨论】:

标签: sql postgresql


【解决方案1】:

您可以将CASERANDOM() 函数结合使用来实现此目的。

例如:

SELECT
    'Business name ' || id AS business_name,
    (NOW() + (random() * (NOW() + '90 days' - NOW())) + '30 days') AS created_at,
    case when random() < 0.3333 then 'NEW'
         when random() < 0.5 then 'IN_PROGESS'
         else 'COMPLETED'
    end AS status
FROM generate_series(1,10) as g(id);

结果:

 business_name     created_at                     status     
 ----------------- ------------------------------ ---------- 
 Business name 1   2021-12-03 07:37:08.519843+00  NEW        
 Business name 2   2022-01-22 19:14:10.085483+00  COMPLETED  
 Business name 3   2021-11-23 16:47:39.207064+00  COMPLETED  
 Business name 4   2022-01-26 13:08:33.643398+00  NEW        
 Business name 5   2021-12-05 03:26:44.730359+00  COMPLETED  
 Business name 6   2022-02-07 07:15:05.470689+00  COMPLETED  
 Business name 7   2022-01-13 05:00:15.326175+00  COMPLETED  
 Business name 8   2022-02-08 02:43:43.123768+00  IN_PROGESS 
 Business name 9   2021-11-17 06:06:40.14872+00   NEW        
 Business name 10  2021-12-19 07:59:55.786655+00  NEW        

请参阅db<>fiddle 的运行示例。

【讨论】:

  • 第二个 WHEN 条件不应该是&lt; 0.6666 以获得均匀分布吗?
  • @a_horse_with_no_name 有趣。我假设 PostgreSQL 每次都会再次运行 RANDOM() 函数。您的评论指向相反的方向;即在同一行上重复使用单个 RANDOM() 函数调用。 select random(), random() 的快速运行表明它每次都运行它。见dbfiddle.uk/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2023-02-07
  • 2016-06-20
  • 2012-09-11
  • 1970-01-01
相关资源
最近更新 更多