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