gpt4 book ai didi

sql - 如何生成虚拟表以在 PostgreSQL 中生成日期序列?

转载 作者:行者123 更新时间:2023-11-29 11:14:50 32 4
gpt4 key购买 nike

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

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

最佳答案

日期列表

使用 generate_series function获取可以添加到日期以获取日期列表的数字列表:

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,但我不认为它们是 supported by PostgreSQL currently .最一致支持的旋转查询的方法是使用聚合函数:

   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

动态列

...表示dynamic SQL .

关于sql - 如何生成虚拟表以在 PostgreSQL 中生成日期序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4002029/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com