【问题标题】:PostgreSQL: generate a random number each hourPostgreSQL:每小时生成一个随机数
【发布时间】:2016-08-02 19:26:56
【问题描述】:

有没有办法为计数生成一个随机数?我想用它作为我正在做的计数的唯一标识符。这是一个示例查询:

SELECT COUNT(distinct bt.id) AS count,
       <insert unique id here>       
FROM boats bt
WHERE bt.created_at >= current_date AND
      bt.created_at < current_date + INTERVAL '1 day' AND
      bt.state != 'deactivated';

我希望它每小时生成一个新数字。

期望的输出

count    id
23     432543

以上 ID 应每小时更新一次。

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助,假设您不只是想知道random() 的效果。
  • 你每小时生成一次 COUNT 吗?
  • 为什么不使用当前日期+当前小时作为唯一标识符?生成随机数并不能确保它是唯一的。
  • 必须是随机的吗?为什么不只是一个自动递增的 id?可以是 GUID 吗?
  • @VincentSavard,是的。也许很简单:date_trunc('hour', current_timestamp)

标签: sql postgresql


【解决方案1】:

我猜你想要这个:

SELECT h.hh, COUNT(distinct bt.id) AS count,
FROM generate_series(0, 23) h(hh) LEFT JOIN
     boats bt JOIN
     ON extract(hour from bt.created_at) = h.hh AND
        bt.created_at >= current_date AND
        bt.created_at < current_date + INTERVAL '1 day' AND
        bt.state <> 'deactivated'
GROUP BY h.hh
ORDER BY h.hh;

这里没有“随机”数字。如果您真的想将其转换为标识符,请使用 YYYYMMDDHH 格式或使用小时作为随机数生成器的种子。

【讨论】:

    【解决方案2】:

    你可以试试这个

    SELECT COUNT(distinct bt.id) AS count,
           to_char(now(),'YYYYMMDDHH24')::integer AS ID
    FROM boats bt
    WHERE bt.created_at >= current_date AND
          bt.created_at < current_date + INTERVAL '1 day' AND
          bt.state != 'deactivated';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 2014-12-27
      • 2018-04-21
      • 2014-08-01
      • 2022-11-21
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多