2016-03-11 4 views
0

У меня есть таблица, которая выглядит следующим образом:Повторите номер строки раза на основе значения столбца

| 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?

+0

Возможный дубликат [Как я могу расшириться строку в множественного результирующего набора строк?] (Http://stackoverflow.com/questions/13385574/how-can-i-expand-out-a-row -into-multiple-row-result-set) – Bulat

+0

@Bulat Не совсем. Не PG, и в PG также есть лучшие решения, чем в этом ответе. – Patrick

+0

@Patrick, Спасибо Патрику за обновление моего вопроса –

ответ

2

заимствование из Abelisto's answer, вы можете создать серию из значения duration_day с generate_series()table function в списке источников строки. Функция использует значение duration_day от my_table через неявный lateral join.

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

Чтобы перестать обсуждать использование 'generate_series()' [здесь это решение без него] (http://pastebin.com/1Vavy8yT) :) – Abelisto

+1

@Abelisto Yeah. Почему это легко, когда есть трудный путь? {;-) – Patrick

+0

Я согласен с тобой. Мне не нравится 'generate_series()' где угодно, кроме предложения 'from'. –

0
select 
    name, 
    start_date + generate_series(0, duration_day - 1) 
from 
    your_table; 
+0

C'mon! 'generate_series()' в списке выбора - это плохая практика. Вы можете сделать это лучше! – Patrick