在 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
我想获取 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