JOIN 当前行和上一行之间的范围
JOIN on range between current and previous row
有人能帮帮我吗?我有两个表:价格和间隔:
Prices: Intervals:
Price Interval_bound Category
16 5 cheap
11 10 cheap
9 15 median
26 20 median
6 25 expensive
我需要根据区间将类别值加入价格,其中 Interval_bound 是类别的 最低 范围:
Price Category
16 median
11 cheap
9 cheap
26 expensive
6 cheap
我试过
select Price, Category from Prices
left join Intervals on Prices.Price interpolate previous value Interval.Interval_bound
但它只为类别提供了 NULL。我怎样才能以最简单的方式做到这一点?我正在使用 Vertica。
您可以使用 lead()
获取下一个上限,然后 join
:
select p.Price, i.Category
from Prices p left join
(select i.*,
lead(interval_bound) over (order by interval_bound) as next_interval_bound
from Intervals i
) i
on p.price >= i.interval_bound and
(p.price < i.next_interval_bound or i.next_interval_bound is null);
我很困惑 - 为什么你的版本不起作用?
-- your input ..
WITH
prices(price) AS (
SELECT 16
UNION ALL SELECT 11
UNION ALL SELECT 9
UNION ALL SELECT 26
UNION ALL SELECT 6
)
,
-- your other input
intervals(interval_bound,category) AS (
SELECT 5,'cheap'
UNION ALL SELECT 10,'cheap'
UNION ALL SELECT 15,'median'
UNION ALL SELECT 20,'median'
UNION ALL SELECT 25,'expensive'
)
-- the way I would write it ...
SELECT
p.price
, i.category
FROM prices p
LEFT JOIN intervals i
ON p.price INTERPOLATE PREVIOUS VALUE i.interval_bound
;
price | category
-------+-----------
6 | cheap
9 | cheap
11 | cheap
16 | median
26 | expensive
-- the way you wrote it ...
select Price, Category from Prices
left join Intervals on Prices.Price interpolate previous value Intervals.Interval_bound;
Price | Category
-------+-----------
6 | cheap
9 | cheap
11 | cheap
16 | median
26 | expensive
你的情况出了什么问题?
有人能帮帮我吗?我有两个表:价格和间隔:
Prices: Intervals:
Price Interval_bound Category
16 5 cheap
11 10 cheap
9 15 median
26 20 median
6 25 expensive
我需要根据区间将类别值加入价格,其中 Interval_bound 是类别的 最低 范围:
Price Category
16 median
11 cheap
9 cheap
26 expensive
6 cheap
我试过
select Price, Category from Prices
left join Intervals on Prices.Price interpolate previous value Interval.Interval_bound
但它只为类别提供了 NULL。我怎样才能以最简单的方式做到这一点?我正在使用 Vertica。
您可以使用 lead()
获取下一个上限,然后 join
:
select p.Price, i.Category
from Prices p left join
(select i.*,
lead(interval_bound) over (order by interval_bound) as next_interval_bound
from Intervals i
) i
on p.price >= i.interval_bound and
(p.price < i.next_interval_bound or i.next_interval_bound is null);
我很困惑 - 为什么你的版本不起作用?
-- your input ..
WITH
prices(price) AS (
SELECT 16
UNION ALL SELECT 11
UNION ALL SELECT 9
UNION ALL SELECT 26
UNION ALL SELECT 6
)
,
-- your other input
intervals(interval_bound,category) AS (
SELECT 5,'cheap'
UNION ALL SELECT 10,'cheap'
UNION ALL SELECT 15,'median'
UNION ALL SELECT 20,'median'
UNION ALL SELECT 25,'expensive'
)
-- the way I would write it ...
SELECT
p.price
, i.category
FROM prices p
LEFT JOIN intervals i
ON p.price INTERPOLATE PREVIOUS VALUE i.interval_bound
;
price | category
-------+-----------
6 | cheap
9 | cheap
11 | cheap
16 | median
26 | expensive
-- the way you wrote it ...
select Price, Category from Prices
left join Intervals on Prices.Price interpolate previous value Intervals.Interval_bound;
Price | Category
-------+-----------
6 | cheap
9 | cheap
11 | cheap
16 | median
26 | expensive
你的情况出了什么问题?