【发布时间】:2021-07-26 02:04:56
【问题描述】:
我在 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 值, 直到我们到达 ID 值的最低行(示例中为 11),在这种情况下,我们在表 B 中查找相同 A 和 B 的 max(dat)(如果有多行具有相同的 max(dat)我们得到包含最大(ID)的行,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
【问题讨论】:
-
你能分享一下你是怎么做到的吗?我会在 A & B 的 UNION ALL 上做一个 LAG。
-
@dnoeth 是的,我粉碎了我的查询,您可以看到,但它不能正常工作,因为它将 A 中的所有行与 B 中的行连接
-
left join ( select A,B,C,id,dat from table_b) b实际上是“所有行” -
这就是为什么我试图用qualify来纠正这个问题,但它似乎不起作用,如果我把qualify放在b查询中它不会起作用,因为它在不检查连接的情况下获得最大值
标签: sql join teradata teradata-sql-assistant