Как создать виртуальную таблицу для генерации последовательности дат в PostgreSQL? - PullRequest
11 голосов
/ 23 октября 2010

Я хотел бы создать список дат с надеждой на объединение с другой таблицей, но я не знаю, какой синтаксис использовать, что-то похожее на это:

SELECT dates.date, transactions.account_id, transactions.amount
  FROM (...) as dates
       LEFT JOIN transactions ON transactions.date = dates.date
 WHERE dates.date >= '2010-01-01' AND dates.date <= '2010-12-31'
 ORDER BY dates.date;

Я хочу даты, чтобы мне больше не приходилось обрабатывать данные на стороне клиента. Я использую это для отображения таблицы, подобной этой:

Account    2010-01-01    2010-01-02    2010-01-03    Balance
============================================================
Chase 123        +100           -20           -70        +10
Chase 231                       +13            -9         +4

1 Ответ

11 голосов
/ 23 октября 2010

Список дат

Используйте функцию generate_series , чтобы получить список чисел, которые можно добавить к дате, чтобы получить список дат:

SELECT CURRENT_DATE + s.a AS dates 
  FROM generate_series(0,14,7) as s(a);

Результат:

dates
------------
2004-02-05
2004-02-12
2004-02-19

Поворотная

Последняя часть вашего вопроса связана с поворотом набора результатов - преобразованием данных строки в столбчатые данные. PIVOT и UNPIVOT - это ANSI, но я не вижу их как , поддерживаемых PostgreSQL в настоящее время . Наиболее последовательно поддерживаемый способ поворота запроса - использование агрегатных функций:

   SELECT t.account,
          SUM(CASE WHEN t.date = '2010-01-01' THEN t.amount END) AS '2010-01-01',
          SUM(CASE WHEN t.date = '2010-01-02' THEN t.amount END) AS '2010-01-02',
          SUM(CASE WHEN t.date = '2010-01-03' THEN t.amount END) AS '2010-01-03',
          SUM(t.amount) AS Balance
     FROM (SELECT CURRENT_DATE + s.a AS dates 
             FROM generate_series(0,14,7) as s(a)) x
LEFT JOIN TRANSACTIONS y ON y.date = x.date
 GROUP BY t.account

Динамические столбцы

... означает динамический SQL .

...