我有一个表(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个帐户,但是例如其中三个帐户被修改。
是否需要第二个查询,或者可以在同一条件下完成?
答案 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;
现在我得到了下表
修改日期实际上可以是null
,但不幸的是创建日期也可以是null
。
查看原始数据,例如,有两条记录的修改日期为2017年12月(创建日期为null
)。
原始数据显示,至少一个帐户已于2018年1月创建,但未显示执行此横向联接。