如何解决使用rank时无法将窗口调用分解为组
我有一个属性数据集,我正在尝试按属性计数对每个细分进行排名。然后,我想将具有大多数属性的段分配为管理这些属性的xml_id的段。我已经尝试过了:
select
yyyy_mm_dd,xml_id,ps_segment
from(
select
pspd.yyyy_mm_dd,xppd.xml_id,ps.ps_segment,count(pspd.property_id) as property_count.
rank() over (partition by pspd.yyyy_mm_dd order by count(pspd.property_id) desc) rn
from(
select
yyyy_mm_dd,property_id
from
t1
) pspd
left join(
select
yyyy_mm_dd,property_id,xml_id
from
t2
) xppd on xppd.property_id = pspd.property_id and xppd.yyyy_mm_dd = pspd.yyyy_mm_dd
inner join
t3 ps on ps.property_id = property_id
group by
1,2,3
) x
where
rn = 1
以上内容引发以下错误:
编译语句时出错:失败:SemanticException无法将窗口调用分解为组。至少1组必须仅取决于输入列。还要检查循环依赖性。基本错误:org.apache.hadoop.hive.ql.parse.SemanticException:第5:50行表达式不在GROUP BY键'property_count'
中
因此,xml_id
本质上以ps_segment
结尾,而{{1}}具有最高的属性计数。我在查询中做错了什么?
解决方法
我自己解决了此问题,以下查询有效。看来我应该一直使用ROW_NUMBER()
而不是RANK()
:
select
yyyy_mm_dd,xml_id,ps_segment
from(
select
pspd.yyyy_mm_dd,xppd.xml_id,ps.ps_segment,count(pspd.property_id) as property_count,ROW_NUMBER() over (partition by pspd.yyyy_mm_dd,xml_id order by count(pspd.property_id) desc) rn
from(
select
yyyy_mm_dd,property_id
from
t1
where
and yyyy_mm_dd = '2019-10-10'
) pspd
left join(
select
yyyy_mm_dd,property_id,xml_id
from
t2
where
yyyy_mm_dd = '2019-10-10'
) xppd on xppd.property_id = pspd.property_id and xppd.yyyy_mm_dd = pspd.yyyy_mm_dd
inner join
t3 ps on ps.hotel_id = pspd.hotel_id
group by
1,2,3
) x
where
rn = 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。