如何在 hive sql 中获取每个组的最大 row_number()
Posted
技术标签:
【中文标题】如何在 hive sql 中获取每个组的最大 row_number()【英文标题】:How to get the maximum row_number() for each group in hive sql 【发布时间】:2018-06-28 14:52:53 【问题描述】:使用 hive SQL 中的 row_number() 我可以通过在 where 子句中选择 1 来过滤重复项/选择 id 的第一个实例,如下所示。我在这里需要的是如何找到每个组中的最后一个实例。
select * from
(select c1,c2,c3,c4,c5,id, row_number() over(partition by id ORDER BY id) as seq
from
table) as cnt where seq = 1;
我的要求是,例如,如果 id 1212 有 3 个实例,而 1313 在表中有 5 个实例,如下所示,我可以使用上面的查询并通过在 where 子句中选择 1 来获取一个实例。但我希望下面的 id 1212 为 3,id 1313 为 5。
c1, c2, c3, c4, c5, ID seq
2020 2020 2020 2020 2020 1212 1
2021 2020 2021 2020 2021 1212 2
2022 2020 2022 2020 2022 1212 3
2023 2020 2023 2020 2023 1313 1
2024 2020 2024 2020 2024 1313 2
2025 2020 2025 2020 2025 1313 3
2026 2020 2026 2020 2026 1313 4
2026 2020 2026 2020 2026 1313 5
【问题讨论】:
您是否还有其他列,这就是您需要行号的原因?否则你可以只使用 group by 和 count。 我还有其他专栏。 【参考方案1】:select id,max(seq) over(partition by id ORDER BY id)from
(select *, row_number() over(partition by id ORDER BY id) as seq
from
table)maxseq
group by id
【讨论】:
很抱歉给您带来了困惑。我也在选择其他列,我在问题中编辑了我的查询。【参考方案2】:使用COUNT(*) OVER (PARTITION BY id) AS cnt
添加一个额外的列。这将包含组中的行数,这也是该组的最大 ROW_NUMBER 值。
【讨论】:
select * from (select id, row_number() over(partition by id ORDER BY id ASC) as seq, COUNT() OVER (PARTITION BY id) AS cnt from table) as cnt where seq = 1个;这个查询很有用。收到此错误:编译语句时出错:失败:SemanticException 无法将窗口调用分解为组。至少 1 个组必须仅依赖于输入列。还要检查循环依赖。潜在错误:org.apache.hadoop.hive.ql.exec.UDFArgumentException:需要参数 抱歉,试试COUNT(*)
而不是COUNT()
。将您的子查询重命名为 cnt
以外的名称可能不会有什么坏处,因为那已经是一个列名。【参考方案3】:
使用group by
中的所有这些列,并在row_number()
上使用max
select c1,c2,c3,c4,c5,id,max(r_no)
from
(
select c1,c2,c3,c4,c5,id, row_number() over (partition by id ORDER BY c1,c2,c3,c4,c5,id) as r_no
from
table
) a
group by c1,c2,c3,c4,c5,id
【讨论】:
【参考方案4】:将升序改为降序:
select t.*
from (select c1, c2, c3, c4, c5, id,
row_number() over (partition by id ORDER BY id desc) as seqnum
------------------------------------------------------------^
from table
) t
where seqnum = 1;
【讨论】:
以上是关于如何在 hive sql 中获取每个组的最大 row_number()的主要内容,如果未能解决你的问题,请参考以下文章