在 Vertica 中加入最后一个日期的一行

Join one row with last foregoing date in Vertica

我想获取 table B 中的状态,该状态在 table A 中的事件日期是当前状态。

Table A
Person: Date:       Event
Bob     2020-01-05  Party

Table B
Person:  Date: Status
Bob      2020-01-08     Awake 
Bob      2020-01-03     Dinner
Bob      2020-01-01     Cycling

所以正确的结果是

Bob     2020-01-05  Party Dinner

我试过了,但出现错误 'Correlated subquery expression without aggregates and with limit is not supported'。

SELECT 
    A.Person, 
    A.Date, 
    A.Event,
    (
        SELECT Status FROM B
        WHERE A.Person = B.Person AND B.Date <= A.Date
        ORDER BY B.Date desc
        LIMIT 1
    ) AS Status
FROM A

谁能告诉我应该怎么做?我尝试了其他一些想法,但 运行 陷入其他错误。

如果你只想要一个人的结果,你可以排序和限制:

select
    a.person,
    a.date,
    a.event,
    b.status
from tablea a
inner join tableb b on b.person = a.person
where a.person = 'Bob'
order by b.date desc
limit 1

如果您想一次处理多个人,一个选择是使用 window 功能:

select *
from (
    select
        a.person,
        a.date,
        a.event,
        b.status,
        row_number() over(partition by a.person order by b.date desc) rn
    from tablea a
    inner join tableb b on b.person = a.person
) t
where rn = 1

Vertica 有 "Event Series Join"!

left, right or full outer join two tables with the INTERPOLATE PREVIOUS value predicate, 根据连接列将当前行与另一个 table 的前一行连接起来:

WITH 
a(person, dt,Event) AS (
SELECT 'Bob',DATE '2020-01-05','Party'
)
,
b(person,dt,status) AS (
          SELECT 'Bob', DATE '2020-01-08','Awake'
UNION ALL SELECT 'Bob', DATE '2020-01-03','Dinner'
UNION ALL SELECT 'Bob', DATE '2020-01-01','Cycling'
)
SELECT
  a.person
, a.dt
, a.event
, b.status
FROM a
LEFT OUTER JOIN b
 ON a.person = b.person
AND a.dt INTERPOLATE PREVIOUS VALUE b.dt
;
-- out  person |     dt     | event | status 
-- out --------+------------+-------+--------
-- out  Bob    | 2020-01-05 | Party | Dinner