Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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_Join_Teradata_Teradata Sql Assistant - Fatal编程技术网

仅将最低的行与另一个SQL表中最近的行联接

仅将最低的行与另一个SQL表中最近的行联接,sql,join,teradata,teradata-sql-assistant,Sql,Join,Teradata,Teradata Sql Assistant,我在Teradata中有两个表,如下所示: 表A A|B|ID|C |D 1|2|11|hh| 1|2|31|zz|ss 1|2|21|ee|nn 表B A|B|ID|C |D |dat 1|2|10|yy|tt|'2021-01-01' 1|2|07|tt|uu|'2021-01-01' 1|3|12|ee|oo|'2021-01-02' 输出 A|B|ID|C |D 1|2|11|hh|yy 1|2|21|ee|hh 1|2|31|zz|ee 解释 目标是计算D列的值,因此,我们从表A

我在Teradata中有两个表,如下所示:

表A

A|B|ID|C |D
1|2|11|hh|
1|2|31|zz|ss
1|2|21|ee|nn
表B

A|B|ID|C |D |dat
1|2|10|yy|tt|'2021-01-01'
1|2|07|tt|uu|'2021-01-01'
1|3|12|ee|oo|'2021-01-02'
输出

A|B|ID|C |D
1|2|11|hh|yy
1|2|21|ee|hh
1|2|31|zz|ee
解释

目标是计算D列的值,因此,我们从表A中的行开始,表A实际上是一个with查询 对于相同的A和B,我们在ID值中查找前一行,得到C的值,它将是当前行的D值, 在我们到达示例中ID值11的最低行之前,在本例中,我们在表B中查找相同A和B的maxdat。如果有多行具有相同的maxdat,我们将得到该行包含示例中当前行11的ID 我尝试了下面的查询,以使用Lag函数获得结果,但我无法将表A中的最低id与表B中的行进行连接

SELECT 
a.A,
a.B,
a.ID,
a.C,
case when lag(a.A,1)over(partition by a.A,a.B order by a.id) isnot null then
lag(a.D,1)over(partition by a.A,a.B order by a.id) else b.c end as D 

from 
table_a a
left join ( select A,B,C,id,dat
from 
table_b) b
on a.A=b.A
and a.B = b.B
and a.id > b.id

qualify row_number () over(partion by b.A,b.B order by b.dat desc,b.id desc) = 1

非相等联接的性能会很差,当它们需要行数时,性能会更差

使用UNION ALL合并两个表,然后按所需方式对数据进行排序,并使用LAG获取前一行的值,而不是将它们合并

select a, b, id, c
-- find the previous NOT NULL value, prefer table_a over table_b
  ,coalesce(lag(case when x = 1 then c end ignore nulls) over (partition by A, B order by id)
           ,lag(case when x = 2 then c end ignore nulls) over (partition by A, B order by id)) as D 
from 
 ( -- combine both table into one, x indicates where a row is coming from
   select 1 as x, a, b, id, c
   from table_a
   union all
   select 2 as x, a, b, id, c
   from table_b
) as dt
-- now remove all rows from table_b
qualify x = 1

你能分享一下你是怎么做到的吗?我会在所有a&B的联合上做一个延迟。@dnoeth是的,我撕碎了我的查询,你可以看到,但它工作不好,因为它将a中的所有行与Bleft中的Row连接选择a、B、C、id,表b中的dat实际上表示所有行这就是为什么我试图用QUICITE来纠正这一点,但它似乎不起作用,如果我在b查询中放入QUICITE,它将不起作用,因为它在未检查JoinThank@dnoeth的情况下获得最大值,它确实很接近,但是如果表a或b中前一行的C为null,该怎么办,如果表a中只有一行a和b列,而表b中没有任何列,我想忽略null会破坏结果吗?我不知道您想要哪个结果。如果前面的行为null,则忽略null将采用前面的值。