Hive 以毫秒连接列
Hive joining columns with milliseconds
我有一个 table 具有列 id、create_time、代码。
create_time 列是字符串类型,时间戳值的格式为 yyyy-MM-dd HH:mm:ss.SSSSSS
现在我的要求是为每个id找到最新的代码(最近的create_time)。如果 create_time 列没有毫秒部分,我可以
select id,create_time,code from(
select id,max(unix_timestamp(create_time,"yyyy-MM-dd HH:mm:ss")) over (partition by id) as latest_time from table)a
join table b on a.latest_time=b.create_time
由于 unix 时间函数只考虑秒而不是毫秒,因此我无法继续使用它们。
请帮忙
您为什么要尝试转换?因为您只是在寻找最新的时间戳,所以我会这样做:
select id,create_time,code from(
select id,max(create_time) over (partition by id) as latest_time from table)a
join table b on a.latest_time=b.create_time
没有毫秒的将被视为“000000”。
您不需要为此加入。
如果您需要所有具有最大值 (create_time) 的记录,请使用 rank() 或 dense_rank()。如果同一时间的记录很多,Rank 会为所有最新 create_time 的记录分配 1。
如果每个 id 只需要一个记录,即使有很多记录 create_time=max(create_time),那么使用 row_number()
而不是 rank()
:
select id,create_time,code
from
(
select id,create_time,code,
rank() over(partition by id order by create_time desc) rn
)s
where rn=1;
我有一个 table 具有列 id、create_time、代码。 create_time 列是字符串类型,时间戳值的格式为 yyyy-MM-dd HH:mm:ss.SSSSSS 现在我的要求是为每个id找到最新的代码(最近的create_time)。如果 create_time 列没有毫秒部分,我可以
select id,create_time,code from(
select id,max(unix_timestamp(create_time,"yyyy-MM-dd HH:mm:ss")) over (partition by id) as latest_time from table)a
join table b on a.latest_time=b.create_time
由于 unix 时间函数只考虑秒而不是毫秒,因此我无法继续使用它们。
请帮忙
您为什么要尝试转换?因为您只是在寻找最新的时间戳,所以我会这样做:
select id,create_time,code from(
select id,max(create_time) over (partition by id) as latest_time from table)a
join table b on a.latest_time=b.create_time
没有毫秒的将被视为“000000”。
您不需要为此加入。
如果您需要所有具有最大值 (create_time) 的记录,请使用 rank() 或 dense_rank()。如果同一时间的记录很多,Rank 会为所有最新 create_time 的记录分配 1。
如果每个 id 只需要一个记录,即使有很多记录 create_time=max(create_time),那么使用 row_number()
而不是 rank()
:
select id,create_time,code
from
(
select id,create_time,code,
rank() over(partition by id order by create_time desc) rn
)s
where rn=1;