Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将月表加入增量表以每月获得一条记录_Sql_Teradata_Teradata Sql Assistant - Fatal编程技术网

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

我想编写一个高效的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 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