如何解决如何考虑报告月份在另一个表中的条目,根据注册时间对记录进行分组?
我有一个表A,其中有一个与帐户关联的注册时间,每个ID只能有一个条目。
对于表A中存在的所有ID,在表B中将有如下状态所示的条目
预期的转换表
对于表A中的每个ID,如果在注册时间的月份中表B中存在ID的相应条目 NO ,请将该ID归为该报告月份的“新建”。同样,如果表B的后续月份中没有对应的ID条目,则希望将其分类为New和新的。
例如:
ID 111 〜于2020年11月注册=>表B没有ID 111的条目=>转换后的表在11月份具有ID 111的条目,状态为New。
ID 112 〜在2020年11月注册=>表B在11月具有ID 112的条目=>转换后的表没有ID 112的条目
ID 113 〜于2020年11月注册=>表B具有从12月开始的ID 113条目=>变换后的表具有11月具有状态New的ID 113条目。
ID 114 〜于2020年11月注册=>表B的ID 114为2021年2月开始的条目=>变换后的表的ID 114为11月,12月,1月的月,条目的状态为New。
解决方法
如果我正确遵循此规则,则可以使用generate_series()
和横向联接:
select a.id,'new' state,s.dt
from tablea a
cross join lateral (
select generate_series(
date_trunc('month',a.registered_time),coalesce(
date_trunc('month',min(b.time)) - interval '1 month',date_trunc('month',a.registered_time)
),'1 month'
)
from tableb b
where b.id = a.id
) s(dt)
诀窍在于生成generate_series()
的参数:如果b
中至少有一个条目可用,我们将从注册时间的月份的月初开始生成日期序列。 a
,直到b
中最早日期的前一个月;如果b
中的日期与a
中的月份相同,则会生成一个空范围,并过滤掉原始行。否则,我们将注册时间作为范围的结尾(生成由单个日期组成的范围)。
id | state | dt --: | :---- | :------------------ 111 | new | 2020-11-01 00:00:00 113 | new | 2020-11-01 00:00:00 114 | new | 2020-11-01 00:00:00 114 | new | 2020-12-01 00:00:00 114 | new | 2021-01-01 00:00:00
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。