Postgres:链接序列日期虚拟表到真实表

时间:2013-10-08 01:56:48

标签: postgresql date sequence

在PostgreSQL中新手。

我有一些SQL基本上列出了从2/4/201310/7/2013的日期序列。 例如:

select date(generate_series(DATE '20130402', DATE '20131007', interval '1' day))

输出:

"2013-04-02"
"2013-04-03"
"2013-04-04"
"2013-04-05"
"2013-04-06"

然后我从myorder表中获得了另一个SQL:

select date(date_created) as date_created1, count(id) from myorder group by date_created1 order by date_created1 desc

输出:

"2013-08-12;2"
"2013-08-08";1"
"2013-08-02";1"
"2013-08-01";1"

基本上,这显示了每天的总订单数。

我的问题是如何将第一个SQL链接到第二个SQL,以便它按顺序输出日期和计数(按日期排序)。此外,如果在“myorder”表中找不到订单,则会显示“0”。

例如:

2013-08-11没有任何订单记录,因此计数列将显示"0"

更像是这样:

"2013-08-12;2"
"2013-08-11;0"
"2013-08-10;0"
"2013-08-09;0"
"2013-08-08;1"
"2013-08-02;1"
"2013-08-01;1"

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

只需加入两者,如下所示:

SELECT dt.d AS date_created1, count(m.id)
FROM
    (
    SELECT date(d)
        FROM generate_series(
            DATE '20130402', DATE '20131007', interval '1' day
        ) AS d
    ) AS dt
    LEFT JOIN myorder m ON m.date_created = dt.d
GROUP BY date_created1
ORDER BY date_created1 DESC

您还可以使用min / max来获取第一个和最后一个日期值。

答案 1 :(得分:1)

我认为使用CTE会让事情变得更容易阅读 - 但这当然是个人选择:

with all_dates as (
  select d::date as 
  from generate_series(DATE '2013-04-02', DATE '2013-10-07', interval '1' day) d
) 
select ad.d,
       count(mo.id) as order_count
from all_dates ad
  left join myorder mo on mo.date_created = ad.d
group by ad.d
order by ad.d;