Как показать все даты из определенного диапазона дат в горизонтальной строке? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть таблица базы данных в PostgreSQL, названная t1 как:

|  Name  |  | StartDate |  | EndDate   |
----------------------------------------
| Oct-18 |  | 2018-10-01|  | 2018-10-05|

Я хочу получить результат для диапазона дат, например:

| Oct-18 | |2018-10-01| |2018-10-02| |2018-10-03| |2018-10-04| |2018-10-05|

с помощью generate_series() Я могу сделать это "по вертикали", но как получить результат в одну строку?

1 Ответ

0 голосов
/ 01 ноября 2018

Используйте generate_series(). Но SQL не допускает динамического числа столбцов результата. Таким образом, вы должны обернуть свой результат в строку, массив или тип документа, чтобы он работал. Пример с конструктором ARRAY в подзапросе LATERAL - в Postgres 10 или новее:

SELECT t1.name, d.date_arr::date[]
FROM   t1
LEFT   JOIN LATERAL (
   SELECT ARRAY(SELECT generate_series(t1.startdate::timestamp
                                     , t1.enddate::timestamp
                                     , interval '1 day'))
   ) d(date_arr) ON true;

Почему (предпочтительно) Postgres 10 или позже?

Почему приведение к timestamp?

Почему LEFT JOIN .. ON true?

Postgres 9,1

LATERAL требуется Postgres 9.3 или более поздняя версия. Вы можете заменить коррелированным подзапросом:

SELECT name
     , ARRAY(SELECT generate_series(startdate::timestamp
                                  , enddate::timestamp
                                  , interval '1 day')::date)
FROM   t1;

Даже работает с pg 8.4:

дБ <> скрипка здесь

Но рассмотрите возможность обновления до текущей версии.

crosstab()

crosstab() также не может преодолеть статическую природу SQL. Есть ограниченные обходные пути с подготовленными типами строк ...

...