Несмотря на то, что вы можете удобно использовать левое соединение с INTERPOLATE PREVIOUS VALUE
, здесь могут быть созвездия данных, в которых вам нужен точный комплексный предикат объединения с объединенным экви- и предикатом BETWEEN, который вы используете.
Если вам это нужно (я не могу придумать случаи, когда вы бы не справились, поэтому помогите мне), это была бы простая OLAP, Window, функция, доступная в Vertica: LAST_VALUE(<_expression_> IGNORE NULLS)
, которая возвращает последнее ненулевое значение в окне OLAP.
Но я сомневаюсь, что вам это нужно, поэтому я добавляю оба решения здесь ниже.
Повторение вашего ввода в начальном предложении WITH
, включающем два выражения Common Table, при вашем объединении это должно выглядеть например:
WITH
a(item,package,start_date,finish_date) as (
SELECT 'X',12345,DATE '2020-01-01',DATE '2020-02-01'
UNION ALL SELECT 'X',6789,DATE '2020-02-02',DATE '2020-03-02'
)
,
b(item,date) AS (
SELECT 'X',DATE '2020-01-15'
UNION ALL SELECT 'X',DATE '2020-02-15'
UNION ALL SELECT 'X',DATE '2020-03-15'
)
SELECT
b.item
, b.date
, LAST_VALUE(a.package IGNORE NULLS) OVER(w) AS package
FROM b
LEFT JOIN a
ON a.item=b.item
AND b.date BETWEEN start_date AND finish_date
WINDOW w AS(PARTITION BY b.item ORDER BY b.date)
ORDER BY 2;
-- out item | date | package
-- out ------+------------+---------
-- out X | 2020-01-15 | 12345
-- out X | 2020-02-15 | 6789
-- out X | 2020-03-15 | 6789
Предикат левого соединения INTERPOLATE PREVIOUS VALUE
работает, однако, и в этом созвездии данных, как вы можете видеть здесь ниже.
WITH
a(item,package,start_date,finish_date) as (
SELECT 'X',12345,DATE '2020-01-01',DATE '2020-02-01'
UNION ALL SELECT 'X',6789,DATE '2020-02-02',DATE '2020-03-02'
)
,
b(item,date) AS (
SELECT 'X',DATE '2020-01-15'
UNION ALL SELECT 'X',DATE '2020-02-15'
UNION ALL SELECT 'X',DATE '2020-03-15'
)
SELECT
b.item
, b.date
, a.package
FROM b
LEFT JOIN a
ON a.item=b.item
AND b.date INTERPOLATE PREVIOUS VALUE start_date
ORDER BY 2;
-- out item | date | package
-- out ------+------------+---------
-- out X | 2020-01-15 | 12345
-- out X | 2020-02-15 | 6789
-- out X | 2020-03-15 | 6789
Стоит попробовать быстрее: предикат объединения диапазона или предикат ИНТЕРПОЛАТНОГО ПРЕДЫДУЩЕГО ЗНАЧЕНИЯ.
Стоит проверить, какая версия быстрее - и вы не всегда в удобной позиции имея finish_date
для игры с ...
Можете ли вы попробовать оба и сказать нам, какой из них был быстрее?