Как создать виртуальную таблицу для генерации последовательности дат в PostgreSQL?
Я хотел бы создать список дат с надеждой на объединение с другой таблицей, но я не знаю, какой синтаксис использовать, что-то похожее на это:
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 ответ
Список дат
Используйте функцию 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.