2013-03-07 5 views
0

У меня есть две таблицы: «su» и «wb». Левое соединение выполняется между ними по атрибутам «su.a» и «wb.b». В таблице «wb» также содержится поле «l_datum». Желаемый вывод: сделать левое соединение между таблицами, но взять только те строки из таблицы «wb» в соединении с максимальным значением поля «wb.l_datum». DB flavor: Teradata Вы можете помочь мне?Extract max datum

+0

в основном каждое предложение, которое я получил здесь. Я также всегда получаю максимальное значение столбца L_Datum во всей таблице. Но я не могу найти максимальное значение столбца L_Datum для определенного значения wb.b, то есть su.a. Именно по этой причине я разместил этот вопрос – Adam

+0

@Adam это то, что «группа by» делает ... – thebjorn

ответ

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 
+0

соединения между su и wb очень сложны - поэтому я ищу решение без дополнительных объединений – Adam

+1

@Adam вам нужно сделать две вещи (i) найти строки, которые включают максимальный l_datum для каждого wb.b и (ii) ограничить исходный выбор только теми строками в wb. Это близко к определению учебника соединения (с группой по подвыборке). Если ваш запрос слишком сложный, вы должны создать представления, которые абстрагируют часть сложности. – thebjorn

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

Какой смысл левого соединения, если вы собираетесь отфильтровывать все строки, в которых не найдена запись из wb? – hvd

+0

ОК, я знаю ... но он сказал: левое соединение делается между ними по атрибутам «su.a» и «wb.b» – Zolyboy

+0

«select max (l_datum) from wb» будет, как я понимаю, вернуть самое последнее значение даты из всей таблицы. Мне это нужно только для определенного значения wb.b. Так что атрибут wb.b имеет более одного значения «wb.L_datum». Я хочу только недавний - wb.b с недавним значением wb.L_datum – Adam

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

+1

«select max (l_datum) from wb» будет, как я понимаю, вернуть самое последнее значение даты из всей таблицы. Мне это нужно только для определенного значения wb.b. Так что атрибут wb.b имеет более одного значения «wb.L_datum». Я хочу только последнее - wb.b с последним значением wb.L_datum – Adam

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

, для l_datum существует более одного значения. Таким образом, таблица «su» имеет более одного атрибута. с su.a Присоединяюсь к таблице wb.b. Мне нужно присоединиться к определенному атрибуту su.a и подключиться только к wb.b, который имеет самое последнее значение L_datum – Adam

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, а не по всем строкам.

+1

, но я считаю, что это даст мне максимальное значение столбца L_Datum для всей таблицы, а не максимальное значение L_Datum для парциального значения su.a = wb.b. Как вы думаете? – Adam

+0

@Adam Да, именно поэтому я уже включил часть «Вы также можете попробовать», которая не получает максимум всей таблицы :) – hvd

+0

Я считаю, что она по-прежнему извлекает максимальное значение L_Datum из всей таблицы. Нет ничего, чтобы связать конкретное значение из su.a с подмножеством значений L_Datum. – Adam

0

Что делать, если вы замените LEFT JOIN с производной таблицы с помощью окна агрегатной функции и QUALIFY положение, чтобы вернуть значение l_datumMAX для каждого значения b

select su.*, wb.* 
    from su 
    left join 
     (
     select * 
      from wb 
     qualify l_datum = max(l_datum) over(partition by wb.b) 
     ) t on wb.b = t.b 
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