Sql 计算每行的随机函数

Sql 计算每行的随机函数,sql,database,postgresql,Sql,Database,Postgresql,我有以下sql: 选择SERIES.TIME作为时间 从生成_序列 将“现在”转换为时间戳-将“1个月”转换为间隔, 将“现在”转换为时间戳, 以“1天”为间隔 作为序列时间 交叉连接 从GENERATE_SERIES1,floorrandom*10::int as RANDOM_表中选择* 这将生成一系列间隔为一小时的日期。我现在想得到的是每天都被随机扇出。我注意到,在上面的sql语句中,random只计算一次,即使它位于子查询中 现在没有交叉连接,我得到: 对于交叉连接,我现在得到了例如:

我有以下sql:

选择SERIES.TIME作为时间 从生成_序列 将“现在”转换为时间戳-将“1个月”转换为间隔, 将“现在”转换为时间戳, 以“1天”为间隔 作为序列时间 交叉连接 从GENERATE_SERIES1,floorrandom*10::int as RANDOM_表中选择* 这将生成一系列间隔为一小时的日期。我现在想得到的是每天都被随机扇出。我注意到,在上面的sql语句中,random只计算一次,即使它位于子查询中

现在没有交叉连接,我得到:

对于交叉连接,我现在得到了例如:

| 2019-02-13 |
| 2019-02-13 |
| 2019-02-13 |
| 2019-02-14 |
| 2019-02-14 |
| 2019-02-14 |
| 2019-02-15 |
| 2019-02-15 |
| 2019-02-15 |
我希望每次扇出时都有一个随机数。例如:

| 2019-02-13 |
| 2019-02-14 |
| 2019-02-14 |
| 2019-02-14 |
| 2019-02-14 |
| 2019-02-15 |
| 2019-02-15 |
| 2019-02-15 |

我需要如何修改查询才能实现这一点?

问题在于过早优化。Postgres忘记了random是不稳定的,每次都应该调用它

这里有一个修正:

SELECT SERIES.TIME AS TIME
FROM (SELECT s.time, (floor(random() * 10)::int) as num
      FROM GENERATE_SERIES(now() - interval '1 month' , now(), interval '1 day') s(time)
         ) AS SERIES (TIME)
         CROSS JOIN LATERAL
         GENERATE_SERIES(1, num) as RANDOM_TABLE
还有一个


请注意,我做了一些替换,这些替换看起来更像Postgres,比如使用now、interval等作为日期算术,而不是转换字符串。

您可以这样做:

SELECT t.time
FROM (
  SELECT series.time as time, (floor(random() * 10)::int) as num_days
  FROM generate_series(now() - interval '1 month', now(), interval '1 day') AS series (time)
) t
  CROSS JOIN generate_series(1, num_days)  
. . 你知道交叉连接在这里起什么作用吗?对我来说,似乎需要横向交叉连接。这是Postgres扩展吗?@GordonLinoff:lateral仅用于子查询/派生表。如果使用集合返回函数,则暗示为横向
SELECT t.time
FROM (
  SELECT series.time as time, (floor(random() * 10)::int) as num_days
  FROM generate_series(now() - interval '1 month', now(), interval '1 day') AS series (time)
) t
  CROSS JOIN generate_series(1, num_days)