30

在 PostgreSQL 中,是否可以生成一系列重复的数字?例如,我想生成数字 1 到 10,每个数字重复 3 次:

1
1
1
2
2
2
3
3
3
.. and so on.
4

8 回答 8

43

您可以将其交叉加入一系列 3:

SELECT a.n
from generate_series(1, 100) as a(n), generate_series(1, 3)
于 2014-04-29T07:45:42.790 回答
18

你可以尝试这样的整数除法:

SELECT generate_series(3, 100) / 3
于 2014-04-29T07:42:29.900 回答
8

对于如此小的数字,CROSS JOIN两个VALUES表达式:

SELECT n
FROM  (VALUES (1),(2),(3)) x(r)  -- repetitions (values are not used)
     ,(VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) y(n); -- numbers

SQL小提琴。

这适用于任何数字序列(包括重复或不规则的模式)。
对于任何更大且具有常规顺序模式的内容,请generate_series()按照建议使用。

于 2014-04-29T07:55:41.520 回答
4
SELECT * FROM (SELECT generate_series(1, 10)) A
JOIN (
  SELECT generate_series(1, 3)
) B ON (TRUE)

http://www.sqlfiddle.com/#!12/d41d8

于 2014-04-29T07:50:25.327 回答
3

我不知道你是否可以在 PostgreSQL 中使用像这样的 generate_series,但我会尝试交叉连接:

SELECT x FROM
  (SELECT generate_series(1, 10) AS x) t1, 
  (SELECT generate_series(1, 3) as y) t2

编辑:

由于 generate_series 已经返回一个表,因此在派生表中不需要 SELECT:

SELECT x FROM
  generate_series(1, 10) AS x, 
  generate_series(1, 3) as y
于 2014-04-29T07:44:55.723 回答
2

只是另一种选择:

select generate_series(1, 3) from generate_series(1, 10)

select generate_series(1, 30) % 10 + 1
于 2014-04-29T08:18:48.857 回答
1
SELECT a.x from generate_series(0, 100) as a(x), generate_series(1, 3)
于 2014-04-29T08:11:54.787 回答
0

就我而言,我正在寻找一个表,其中的列包含如下数据,以便与具有类似列的其他表进行内部连接。

with
  hours(hour) AS (
    select concat(extract(hour from n), ' of ', n::date) as hour
    from
    generate_series(timestamp '2004-03-07', '2004-08-16', '1 hour')
    as a(n)
  )
  
  select * from hours

结果

链接到小提琴https://www.db-fiddle.com/f/7VagpVQwio9e6DVjSwMsTL/1 在此处输入图像描述

实际执行

在此处输入图像描述


我希望这是有帮助的。

于 2021-02-03T08:32:43.573 回答