如何在 PostgreSQL 中生成虚拟表来生成日期序列?

2024-01-14

我想生成一个日期列表,希望与另一个表连接,但我不知道要使用什么语法,类似于:

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

日期列表

Use the 生成系列函数 http://www.postgresql.org/docs/8.0/static/functions-srf.html获取可以添加到日期的数字列表,以便获取日期列表:

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

Result:

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

Pivoting

问题的后一部分涉及旋转结果集——将行数据转换为列数据。 PIVOT 和 UNPIVOT 是 ANSI,但我不认为它们是目前 PostgreSQL 支持 http://www.postgresql.org/docs/current/static/tablefunc.html。最一致支持的旋转查询方法是使用聚合函数:

   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 http://www.postgresql.org/docs/8.1/interactive/ecpg-dynamic.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 PostgreSQL 中生成虚拟表来生成日期序列? 的相关文章

随机推荐