在 Postgresql 中创建一个数量递增的列

Posted

技术标签:

【中文标题】在 Postgresql 中创建一个数量递增的列【英文标题】:Create a column of increasing number in Postgresql 【发布时间】:2021-10-15 09:16:02 【问题描述】:

我想通过 Postgresql(Redshift) 创建一个仅包含单列的 CTE - 将数字增加 1,例如 1,2,3,4,..直到 1000。

【问题讨论】:

【参考方案1】:

是的,CTE 可以做到这一点:

with recursive numbers (nr) as (
  values (1)
  union all
  select p.nr + 1 
  from numbers p
  where p.nr < 1000
)
select *
from numbers;

Online example

【讨论】:

我没有仔细研究过这个 - 正要出去 - 我认为这会自称 1000 次是对的吗?【参考方案2】:

这里是 1024。如果您只想要 1000,请添加“TOP 1000”。

SELECT 
    1 + p0.n
    + p1.n*2
    + p2.n * POWER(2,2)
    + p3.n * POWER(2,3)
    + p4.n * POWER(2,4)
    + p5.n * POWER(2,5)
    + p6.n * POWER(2,6)
    + p7.n * POWER(2,7)
    + p8.n * POWER(2,8)
    + p9.n * POWER(2,9)
    as number
  FROM
    (SELECT 0 as n UNION SELECT 1) p0,
    (SELECT 0 as n UNION SELECT 1) p1,
    (SELECT 0 as n UNION SELECT 1) p2,
    (SELECT 0 as n UNION SELECT 1) p3,
    (SELECT 0 as n UNION SELECT 1) p4,
    (SELECT 0 as n UNION SELECT 1) p5,
    (SELECT 0 as n UNION SELECT 1) p6,
    (SELECT 0 as n UNION SELECT 1) p7,
    (SELECT 0 as n UNION SELECT 1) p8,
    (SELECT 0 as n UNION SELECT 1) p9
  Order by 1 

【讨论】:

哦,这很整洁。自联接,每次将行数加倍。我用它来填充测试表,我从来没有想过将它用作系列生成器。不过,必须有一种方法可以使用更简单、更清晰的 SQL 来做到这一点。 (太好了——还有一件事要弄清楚:-) @MaxGanzII:递归 CTE 可以实现相同的 dbfiddle.uk/… 是的。它们很新,但我还没有使用它们。那么问题是哪种解决方案性能最高,最方便,然后总体上是最佳选择。这也是最不可能使集群崩溃的方法 - Redshift 过去曾遇到过递归问题。 顺便说一句,马,我经常看到你的名字在编辑 Redshift 问题。只是好奇,您与 Redshift 的历史/联系是什么? @MaxGanzII:根本没有,我只是删除了 Redshift 问题的 Postgres 标签

以上是关于在 Postgresql 中创建一个数量递增的列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Documentdb 中创建一个自动递增的列

如何使用 PostgreSQL 在 DBeaver 中创建自动递增/SERIAL id 列?

为啥在 PostgreSQL 中创建生成的列时出现错误?

使用表中的列在 PostgreSQL 中创建视图

Hibernate LocalDateTime:Postgresql 模式生成在外部 Tomcat 中创建类型为“bytea”的列

如何根据行创建日期在 PostgreSQL 中创建自定义序列?