在hive sql查询中选择最近的记录

vhmi4jdf  于 2021-04-02  发布在  Hive
关注(0)|答案(1)|浏览(1247)

我想连接两张表,为表1中的id值选择最近的行。
也就是说,对于表1中的每一个id值,只返回最近添加的一行。例如,表1是这样的。

Columns: ID-value, date-added,      other-information
row 1:    ID_1,    21/2/2020-12:30, other_newer_information...
row 2:    ID_1,    21/2/1990-12:30, other_older_information...

所以,如果在这个表中发现两次相同的id值,只返回最近的条目,即上述案例中的第1行。
然后,我想把这些行和第二张表中的信息连接起来。例如,表2看起来像这样。

Columns: column-present-in-table-1, another-column-present-in-table-1, other-columns
row 1:   some_data,                 some_more_data...                  additional data
row 2:-  some_data, infor_2:        some_more_data...                  additional data
etc

我的sql查询在连接两张表时能正常工作。
但我不能解决的是,当在多个日期输入了重复的ID值时,如何只返回表1中最近的记录?
也不知道日期过滤是作为 "SELECT "的一部分还是在第一次从表1中获取数据时进行。
从stackoverflow的其他地方看,建议是像 "MAX(date_time) "这样的东西--但我的理解是,这只会返回最大的日期时间值,而不是最近的一行--如果我错了,请纠正我的错误。我的查询看起来像这样。

SELECT
    id_1,
    info_1,
    info_2,
    date_time,
    info_3,
    info_4,
    max(info_3),
    min(info_4)
FROM table_1
INNER JOIN table_2
    ON table_1.info_1 = table_2.infor_1
    AND table_1.info_2 = table_2.infor_2
    WHERE id_1 in ("id1", "id2")
    AND info_3 = "10"
    GROUP BY id_1, info_1, info_2, info_3, info_4
    ORDER BY id_1, id_2, date_time DESC

在stackoverflow上的其他建议。 SELECT TOP id_1...min(info_4)(给出语法错误), ORDER BY id_1... date_time DESC LIMIT 1(只返回一行--即最近的日期时间)。
ROW_NUMBER() OVER (PARTITION BY id, ORDER BY date_time) AS 'row_number'返回的是行号,而不是最近的一行。

qlckcl4x

qlckcl4x1#

所以,如果在我的表中发现两次相同的id值,只返回最近的条目,即上述案例中的第1行。
你可以使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by id order by date_time desc) as seqnum
      from mytable t
     ) t
where seqnum = 1;

我真的不知道你的查询和你的问题有什么关系。如果你的 "表 "真的是查询的结果,那么只需要使用cte或者子查询。

with t as (
      <your query here>
     )
<query with row_number here>

相关问题