У меня есть две таблицы: «su» и «wb». Левое соединение выполняется между ними по атрибутам «su.a» и «wb.b». В таблице «wb» также содержится поле «l_datum». Желаемый вывод: сделать левое соединение между таблицами, но взять только те строки из таблицы «wb» в соединении с максимальным значением поля «wb.l_datum». DB flavor: Teradata Вы можете помочь мне?Extract max datum
ответ
Не уверен, 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
соединения между su и wb очень сложны - поэтому я ищу решение без дополнительных объединений – Adam
@Adam вам нужно сделать две вещи (i) найти строки, которые включают максимальный l_datum для каждого wb.b и (ii) ограничить исходный выбор только теми строками в wb. Это близко к определению учебника соединения (с группой по подвыборке). Если ваш запрос слишком сложный, вы должны создать представления, которые абстрагируют часть сложности. – thebjorn
select a
from su
left join wb
on (su.a = wb.b)
where wb.l_datum = (select max(l_datum) from wb)
Какой смысл левого соединения, если вы собираетесь отфильтровывать все строки, в которых не найдена запись из wb? – hvd
ОК, я знаю ... но он сказал: левое соединение делается между ними по атрибутам «su.a» и «wb.b» – Zolyboy
«select max (l_datum) from wb» будет, как я понимаю, вернуть самое последнее значение даты из всей таблицы. Мне это нужно только для определенного значения wb.b. Так что атрибут wb.b имеет более одного значения «wb.L_datum». Я хочу только недавний - wb.b с недавним значением wb.L_datum – Adam
В общем, что я могу думать:
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
«select max (l_datum) from wb» будет, как я понимаю, вернуть самое последнее значение даты из всей таблицы. Мне это нужно только для определенного значения wb.b. Так что атрибут wb.b имеет более одного значения «wb.L_datum». Я хочу только последнее - wb.b с последним значением wb.L_datum – Adam
select * from wb w left join su s
on w.b=s.a
where w.l_datum=(select max(l_datum) from wb);
, для l_datum существует более одного значения. Таким образом, таблица «su» имеет более одного атрибута. с su.a Присоединяюсь к таблице wb.b. Мне нужно присоединиться к определенному атрибуту su.a и подключиться только к wb.b, который имеет самое последнее значение L_datum – Adam
Чтобы убедиться, что вы все равно получите 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
, а не по всем строкам.
, но я считаю, что это даст мне максимальное значение столбца L_Datum для всей таблицы, а не максимальное значение L_Datum для парциального значения su.a = wb.b. Как вы думаете? – Adam
@Adam Да, именно поэтому я уже включил часть «Вы также можете попробовать», которая не получает максимум всей таблицы :) – hvd
Я считаю, что она по-прежнему извлекает максимальное значение L_Datum из всей таблицы. Нет ничего, чтобы связать конкретное значение из su.a с подмножеством значений L_Datum. – Adam
Что делать, если вы замените LEFT JOIN
с производной таблицы с помощью окна агрегатной функции и QUALIFY
положение, чтобы вернуть значение l_datum
MAX
для каждого значения 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
, если вы хотите, чтобы не использовать дополнительные присоединиться годов ... считаете ли вы, что использовать волатильные таблицы для разбивки обработки на этапы?
-- 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
в основном каждое предложение, которое я получил здесь. Я также всегда получаю максимальное значение столбца L_Datum во всей таблице. Но я не могу найти максимальное значение столбца L_Datum для определенного значения wb.b, то есть su.a. Именно по этой причине я разместил этот вопрос – Adam
@Adam это то, что «группа by» делает ... – thebjorn