提取最大基准面

时间:2013-03-07 09:29:09

标签: sql teradata

我有两张桌子:“su”和“wb”。 在属性“su.a”和“wb.b”之间进行左连接。 表“wb”还包含“l_datum”字段。 期望的输出:在表之间进行左连接,但仅从连接中的“wb”表中获取最大值为“wb.l_datum”字段的那些行。 DB风味:Teradata 你能帮我吗?

7 个答案:

答案 0 :(得分:1)

不确定teradata,但在普通的SQL中你会这样做:

select su.*, wb.*
from su
join wb on su.a = wb.b
join (
   select wb.b as b, max(wb.l_datum)
   from wb
   group by wb.b
) t on wb.b = t.b

答案 1 :(得分:0)

select a
from su 
left join wb
on (su.a = wb.b)
where wb.l_datum = (select max(l_datum) from wb)

答案 2 :(得分:0)

总的来说,我能想到的是:

SELECT col1, col2...
FROM su
LEFT OUTER JOIN wb
ON
su.a = wb.b
WHERE
wb.l_datum = (SELECT max(l_datum) FROM wb)

但我认为,您需要多个最大基准,具体取决于组。 在这种情况下,请使用GROUP BY

答案 3 :(得分:0)

select * from wb w left join su s
on w.b=s.a
where w.l_datum=(select max(l_datum) from wb );

答案 4 :(得分:0)

为了确保您仍然获得未找到相应su记录的wb条记录,您可以在加入前过滤wb表。完全接受的语法因数据库而略有不同,但它可能是这样的:

SELECT ...
FROM su
LEFT JOIN (
    SELECT *
    FROM wb
    WHERE wb.l_datum = (
        SELECT MAX(wb_maxdatum.l_datum)
        FROM wb AS wb_maxdatum)
) AS wb_filtered
ON wb_filtered.b = su.a

您也可以尝试

    WHERE wb.l_datum = (
        SELECT MAX(wb_maxdatum.l_datum)
        FROM wb AS wb_maxdatum
        WHERE wb_maxdatum.b = wb.b)

取每b的最大日期,而不是所有行。

答案 5 :(得分:0)

如果使用窗口聚合函数和LEFT JOIN子句将QUALIFY替换为派生表,以便为{{1}的每个值返回MAXl_datum,该怎么办? 1}}

b

答案 6 :(得分:0)

如果您希望不使用其他联接...您是否考虑过利用易失性表将处理分解为步骤?


-- get  max wb table records 
CREATE VOLATILE TABLE vt_01_wb
AS
(
SEL t1.*
FROM wb t1
LEFT JOIN (SEL b, MAX(l_datum) max_l_datum FROM  wb GROUP BY 1) t2
WHERE t1.l_datum = t2.max_l_datum
) 
WITH DATA PRIMARY INDEX(b) 
ON COMMIT PRESERVE ROWS;

CREATE VOLATILE TABLE vt_02
AS
(
SEL su.*, wb.*
FROM su
-- volatile table already contians max l_datum
LEFT JOIN vt_01_wb wb ON su.a = wb.b
) WITH DATA 
ON COMMIT PRESERVE ROWS;

SEL * FROM vt_02

相关问题