Postgres-生成系列

时间:2019-10-16 09:28:55

标签: sql postgresql generate-series

我有一个表(tb1),其中包含带有创建日期(列A)和修改日期(列B)的列。

我想获得一个汇总度量,以显示在给定间隔中创建了多少条记录,以及在同一间隔中创建了多少条记录。

到目前为止,我已经尝试了以下代码:

Select count(distinct tb.id),dd 
from generate_series ('2015-01-01'::timestamp,'2019-11-01'::timestamp,'1 month'::interval)dd
left join tb on tb.columnA<=dd::date
group by dd

就得到下表而言,我收到的输出很好

dd/count
2015-01-01/ 2
2015-02-01/ 6
2015-03-01/ 10
2015-04-01/ 22
...

但是,我想知道如何包含第二列(columB)中的信息,以便我看到在2015-03-01中总共创建了10个帐户,但是例如其中三个帐户被修改。

是否需要第二个查询,或者可以在同一条件下完成?

2 个答案:

答案 0 :(得分:0)

使用lateral join取消数据透视和汇总:

select gs.dd,
       sum(v.is_create) as create_on_date,
       sum(v.is_update) as update_on_day,
       sum(sum(v.is_create)) over (order by gs.dd) as running_creates,
       sum(sum(v.is_update)) over (order by gs.dd) as running_updates
from generate_series('2015-01-01'::timestamp,'2019-11-01'::timestamp,'1 month'::interval
                    ) gs(dd) left join
     (tb cross join lateral
      (values (tb.updatedon, 0, 1), (createdon, 1, 0)
      ) v(dte, is_update, is_create)
     )
     on v.dte::date = dd::date
group by gs.dd
order by gs.dd;

请注意,这在on子句中不使用不等式。相反,它使用select中的累积和。通常,从性能角度来看,这是可取的。

如果where v.dte is not null可能是updatedon,则可能要添加null

答案 1 :(得分:0)

关于您的答案。 非常感谢你。

我执行了横向连接。

select gs.dd,
       sum(v.is_create) as create_on_date,
       sum(v.is_update) as update_on_day,
       sum(sum(v.is_create)) over (order by gs.dd) as running_creates,
       sum(sum(v.is_update)) over (order by gs.dd) as running_updates
from generate_series('2015-01-01'::timestamp,'2019-11-01'::timestamp,'1 month'::interval
                    ) gs(dd) left join
     (tb cross join lateral
      (values (tb.creation_date, 0, 1), (tb.modification_date, 1, 0)
      ) v(dte, is_update, is_create)
     )
     on v.dte::date = dd::date
where v.dte is not null
and tb.gather_stats is not false
group by gs.dd
order by gs.dd;

现在我得到了下表

Screenshot with data output

修改日期实际上可以是null,但不幸的是创建日期也可以是null

查看原始数据,例如,有两条记录的修改日期为2017年12月(创建日期为null)。

原始数据显示,至少一个帐户已于2018年1月创建,但未显示执行此横向联接。