0

a在 Vertica 中有一个表,其中包含item_id附加到的code时间from_date

create table a (
    code      varchar(16),
    item_id   int,
    from_date timestamptz
);

b和一个包含code给定日期的表格t

create table b (
    code    varchar(16),
    t       date
);

我需要a.item_idb.code日期检索b.t。数据看起来像这样:

insert into a values ('abc', 1, '2013-01-01 10:00:00 EST'::timestamptz);
insert into a values ('abc', 2, '2013-01-05 11:00:00 EST'::timestamptz);
insert into a values ('abc', 3, '2013-01-09 9:00:00 EST'::timestamptz);

insert into b values ('abc', '2013-01-06'::date);

我尝试在 LEFT JOIN 中使用 Vertica 的INTERPOLATE,以便及时检索前一(code, item_id)t

select
    b.code, b.t, a.item_id
from  b
left join a on a.code = b.code and b.t INTERPOLATE PREVIOUS VALUE a.t;

这给了我一个类型错误Interpolated predicates can accept arguments of the same type only

所以我尝试转换b.t为时间戳

select
    b.code, b.t, a.item_id
from b
left join a on a.code = b.code
    and (b.t::timestamptz) INTERPOLATE PREVIOUS VALUE a.t;

这给了我一个语法错误Syntax error at or near "INTERPOLATE"

如果没有 INTERPOLATE,SQL 表达式可以工作,但不会加入前一行。

是否可以将我的日期转换为带有 INTERPOLATE 的 JOIN 中的时间戳?

如果没有,是否有任何其他方法可以让我item_id在 time检索当前t

4

2 回答 2

1

通过欺骗解释器并在 SELECT 子查询中将日期转换为时间戳,我找到了一个 hacky 解决方法:

select
    b.code, b.t, a.item_id
from b
left join (select a.t::date, a.code, a.item from a) a on a.code = b.code
    and b.t INTERPOLATE PREVIOUS VALUE a.t;
于 2013-07-26T16:17:46.330 回答
0
select b.code, b.t, a.item_id
from b
left join a on a.code = b.code and b.t = cast(a.t as date);

但是,当“a”表中有超过 1 行,其中 t 包含同一日期的不同时间时,此解决方案可能是错误的。

例如,

insert into a values ('abc', 4, '2013-01-06 8:00:00 EST'::timestamptz);
insert into a values ('abc', 5, '2013-01-06 9:00:00 EST'::timestamptz);

在这种情况下,您应该决定需要哪一行。说,你需要最新的一行:

select b.code, b.t, a.item_id
from b
left join (
    select a1.code, a1.item_id, a2.dt
    from a a1
    inner join (
        select code, cast(t as date) dt, max(t) as max_t
        from a
        group by code, cast(t as date)
    ) a2 on a1.code = a2.code and a1.t = a2.max_t
) a on a.code = b.code and b.t = a.dt;

解决方案可能因您的 DBMS 而异。

于 2013-07-25T19:50:27.110 回答