仅将最低的行与另一个SQL表中最近的行联接
我在Teradata中有两个表,如下所示: 表A仅将最低的行与另一个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
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的IDSELECT
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将采用前面的值。