带有日期范围的SQL JOIN表

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)

(这是我在最终计算任何一天的库存水平时需要的垫脚石,给定起始值和增量)

Erw*_*ter 9

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()
  • A 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)