Sql 如何根据注册时间对记录进行分组,并考虑报告月份另一个表中的条目?

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

我有一个表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月份有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中不起作用。更改问题上的数据库标记基本上会使答案无效。