如何在 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()的主要内容,如果未能解决你的问题,请参考以下文章

获取 ActiveRecord 中每个组的最小值/最大值

当表很大时找到每个组的最大记录时如何优化sql?

如何编写 SQL 来选择具有每个组的最大值(值)的行?

DolphinDB:如何获取每个滑动组的最大值的第一行?

如何编写查询以获取 SQL Server 中每个组的第一个条目? [复制]

返回 Netezza SQL 中每个组的最大值日期