Sql 如何根据注册时间对记录进行分组,并考虑报告月份另一个表中的条目?
我有一个表a,其中有一个帐户的注册时间,每个id只能有一个条目 对于表A中存在的所有Id,表B中会有如下带有状态的条目 预期转换表 对于表A中的每个ID,如果表B中注册时间的月份没有相应的ID条目,则将其归类为该报告月份的新ID。同样,如果在表B的后续月份中没有ID的相应条目,则希望将其与新条目一起分类 例如: ID111~在2020年11月注册=>表B没有ID111的条目=>转换后的表在11月份有一个ID111的条目,状态为New。Sql 如何根据注册时间对记录进行分组,并考虑报告月份另一个表中的条目?,sql,postgresql,datetime,date-arithmetic,lateral-join,Sql,Postgresql,Datetime,Date Arithmetic,Lateral Join,我有一个表a,其中有一个帐户的注册时间,每个id只能有一个条目 对于表A中存在的所有Id,表B中会有如下带有状态的条目 预期转换表 对于表A中的每个ID,如果表B中注册时间的月份没有相应的ID条目,则将其归类为该报告月份的新ID。同样,如果在表B的后续月份中没有ID的相应条目,则希望将其与新条目一起分类 例如: ID111~在2020年11月注册=>表B没有ID111的条目=>转换后的表在11月份有一个ID111的条目,状态为New。 ID112~在2020年11月注册=>表B在11月份有ID
ID112~在2020年11月注册=>表B在11月份有ID112的条目=>转换后的表没有ID112的条目
ID113~于2020年11月注册=>表B包含从12月开始的ID113条目=>转换后的表中包含11月的ID113条目,且状态为New。
ID114~于2020年11月注册=>表B中有ID114的条目,从2021年2月开始=>转换后的表中有ID114的条目,用于11月、12月、1月和州新的月份
如果我没有弄错,您可以使用
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
id | state | dt
--: | :---- | :------------------
111 |新| 2020-11-01 00:00:00
113 |新| 2020-11-01 00:00:00
114 |新| 2020-11-01 00:00:00
114 |新| 2020-12-01 00:00:00
114 |新| 2021-01-01 00:00:00
您的结果与您的解释不完全一致:大概11月份id
113
应该只有一行。您对113应该只有一行entry@Mozhi:Snowflake和Postgres是两个不同的数据库,此解决方案在Snowflake中不起作用。更改问题上的数据库标记基本上会使答案无效。