Mar*_*tus 5 sql postgresql date
说,我有一个包含C列和N行的表.我想生成一个select语句,表示该表的"连接",数据范围包括M天.结果集应该有C + 1列(最后一个是日期)和NXM行.
澄清事情的简单例子:鉴于下表A:
select * from A;
avalue |
--------+
"a" |
Run Code Online (Sandbox Code Playgroud)
日期范围从2012年10月10日到12日,我想要以下结果集:
avalue | date
--------+-------
"a" | 2012-10-10
"a" | 2012-10-11
"a" | 2012-10-12
Run Code Online (Sandbox Code Playgroud)
(这是我在最终计算任何一天的库存水平时需要的垫脚石,给定起始值和增量)
在PostgreSQL的方式做,这是很简单的:
SELECT t.*, g.day::date
FROM tbl t
CROSS JOIN generate_series(timestamp '2012-10-10'
, timestamp '2012-10-12'
, interval '1 day') AS g(day);
Run Code Online (Sandbox Code Playgroud)
准确生成所请求的输出.关键要素是:
CROSS JOIN(如@mu已经评论过)/ 在这种情况下generate_series()generate_series()timestamp- 没有条件的非常基本的连接.同样的,不那么冗长:
SELECT *
FROM tbl t
CROSS JOIN (
VALUES
(date '2012-08-13') -- explicit type in 1st row
, ('2012-09-05')
, ('2012-10-10')
) g(day);
Run Code Online (Sandbox Code Playgroud)
对于任意日期,您可以使用带generate_series()表达式的子选择或CTE .无需坚持表格:
SELECT t.*, g.day::date
FROM tbl t
CROSS JOIN generate_series(timestamp '2012-10-10'
, timestamp '2012-10-12'
, interval '1 day') AS g(day);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5365 次 |
| 最近记录: |