Sql 将月表加入增量表以每月获得一条记录
我想编写一个高效的SQL查询,在这里我想连接两个表。表A左表有每个客户的月度记录,表B有客户每次更改特定维度的增量记录 出于说明目的,这些表可以如下所示: 表A–月报表 表B–增量表 预期结果 如何在TERADATA SQL中编写联接以获得以下结果Sql 将月表加入增量表以每月获得一条记录,sql,teradata,teradata-sql-assistant,Sql,Teradata,Teradata Sql Assistant,我想编写一个高效的SQL查询,在这里我想连接两个表。表A左表有每个客户的月度记录,表B有客户每次更改特定维度的增量记录 出于说明目的,这些表可以如下所示: 表A–月报表 表B–增量表 预期结果 如何在TERADATA SQL中编写联接以获得以下结果 Select Table A.* Table B.ADDRESS From Table A Left Join Table B on Table A.CLNT_NO = Table B.CLNT_NO and
Select
Table A.*
Table B.ADDRESS
From
Table A
Left Join Table B
on Table A.CLNT_NO = Table B.CLNT_NO and HOW TO WRITE DATE JOIN
可以在ON子句中包含子查询:
在大多数数据库中,可以使用相关子查询来表示此逻辑。然而,Teradata不支持相关子查询中的TOP,这使得这种方法更加棘手。这有点猜测,但似乎您基本上希望tableA.me_dt介于tableB.chng_dt之间?如果是这样,我会这样做:
with tblB as
(select
clnt_nm,address,
chng_dt,
coalesce(max(chng_dt) over (partition by clnt_nm order by chng_dt desc rows between 1 preceding and 1 preceding),date '9999-12-31') as next_dt
from
tableb
)
select
tableA.*,tblB.address
from
tableA
inner join tblB
on tableA.clnt_nm = tblB.clnt_nm
and tableA.me_dt >= tblB.chng_dt
and tableA.me_dt < tblB.next_dt
tblB CSV基本上会根据当前行给出开始日期,根据下一行给出结束日期
这一切都是基于这样的假设,即你的日期是实际日期,而不是你的帖子中的字符串。如果它们是字符串,则需要根据它们生成日期。日期实际上是如何存储的?第二个问题,您对比较两个表之间的日期有什么要求?要求是每个客户都有一个月记录,并从增量表中附加信息,以获得该客户的最新信息。例如,您可能是一名客户,拥有10年120条记录,并且仅更改地址两次2条记录。我希望最左边的表有120条记录和相应的地址记录。日期存储为日期。
CLNT_NO ME_DT STATUS ADDRESS
RAMAN Jan-19 ACTIVE TORONTO
RAMAN Feb-19 ACTIVE TORONTO
RAMAN Mar-19 ACTIVE TORONTO
RAMAN Apr-19 INACTIVE TORONTO
RAMAN May-19 INACTIVE TORONTO
RAMAN Jun-19 INACTIVE TORONTO
RAMAN Jul-19 INACTIVE MONTREAL
RAMAN Aug-19 INACTIVE MONTREAL
Select
Table A.*
Table B.ADDRESS
From
Table A
Left Join Table B
on Table A.CLNT_NO = Table B.CLNT_NO and HOW TO WRITE DATE JOIN
select a.*, b.address
from a left
b
on a.CLNT_NO = b.CLNT_NO and
b.ME_DT = (select max(b2.ME_DT)
from b b2
where b2.CLNT_NO = b.CLNT_NO and b2.me_dt <= a.chng_dt
);
with tblB as
(select
clnt_nm,address,
chng_dt,
coalesce(max(chng_dt) over (partition by clnt_nm order by chng_dt desc rows between 1 preceding and 1 preceding),date '9999-12-31') as next_dt
from
tableb
)
select
tableA.*,tblB.address
from
tableA
inner join tblB
on tableA.clnt_nm = tblB.clnt_nm
and tableA.me_dt >= tblB.chng_dt
and tableA.me_dt < tblB.next_dt