【问题标题】:Repeat row number of times based on column value根据列值重复行数
【发布时间】:2016-06-27 08:45:29
【问题描述】:

我的表格如下所示:

| name |  start_date   |  duration_day|
========================================
|   A  |  2015-01-01   |       3      |
|   B  |  2015-01-02   |       2      |

现在我想得到这样的输出:

   | name |     date   |
   =====================
   |  A   | 2015-01-01 |
   |  A   | 2015-01-02 |
   |  A   | 2015-01-03 |
   |  B   | 2015-01-02 |
   |  B   | 2015-01-03 |

如何在 PostgreSQL 中做到这一点?

【问题讨论】:

标签: sql postgresql generate-series set-returning-functions


【解决方案1】:

借用Abelisto's answer,您可以使用行源列表中的generate_series() table functionduration_day 值生成一个系列。该函数使用来自my_table 到隐式lateral joinduration_day 值。

SELECT name, start_date + n AS date
FROM my_table, generate_series(0, duration_day - 1) AS x(n);

【讨论】:

  • 停止讨论 generate_series() 用法 here is solution without it :)
  • @Abelisto 是的。有困难的时候为什么要容易? {;-)
  • 我同意你的看法。除了from 子句之外,我不喜欢generate_series()
  • 你能告诉为什么 generate_series in select 不好?
  • @JaehyunShin generate_series() 是所谓的表函数(点击我的答案中的链接):“表函数是产生一组行的函数,由任一基本数据类型(标量类型)或复合数据类型(表行)。它们在查询的 FROM 子句中用作表、视图或子查询。在某些情况下,在选择列表中使用表函数会导致不可预知的结果,尤其是在使用多个表函数时。
【解决方案2】:
select
  name, 
  start_date + generate_series(0, duration_day - 1)
from
  your_table;

【讨论】:

  • 来吧!选择列表中的generate_series() 是不好的做法。你可以做得更好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2021-05-04
  • 2014-09-03
  • 2019-05-29
  • 1970-01-01
  • 2019-05-09
相关资源
最近更新 更多