gpt4 book ai didi

sql - 在不使用 ROW_NUMBER() OVER 函数的情况下获取分区内行(等级)的序列号

转载 作者:行者123 更新时间:2023-12-03 20:23:17 28 4
gpt4 key购买 nike

我需要按分区(或组)对行进行排名,即如果我的源表是:

NAME PRICE
---- -----
AAA 1.59
AAA 2.00
AAA 0.75
BBB 3.48
BBB 2.19
BBB 0.99
BBB 2.50
我想获得目标表:
RANK NAME PRICE
---- ---- -----
1 AAA 0.75
2 AAA 1.59
3 AAA 2.00
1 BBB 0.99
2 BBB 2.19
3 BBB 2.50
4 BBB 3.48
通常我会使用 ROW_NUMBER() OVER函数,所以在 Apache Hive 中它将是:
select
row_number() over (partition by NAME order by PRICE) as RANK,
NAME,
PRICE
from
MY_TABLE
;
不幸的是,Cloudera Impala 不支持(目前) ROW_NUMBER() OVER功能,所以我正在寻找解决方法。最好不要使用 UDAF,因为说服将其部署到服务器在政治上是困难的。

最佳答案

如果您不能使用相关子查询来做到这一点,您仍然可以使用连接来做到这一点:

select t1.name, t1.price,
coalesce(count(t2.name) + 1, 1)
from my_table t1 join
my_table t2
on t2.name = t1.name and
t2.price < t1.price
order by t1.name, t1.price;

请注意,这并不完全正确 row_number()除非给定的所有价格都不同 name .这个公式实际上相当于 rank() .

对于 row_number() ,您需要一个唯一的行标识符。

顺便说一下,以下等价于 dense_rank() :
select t1.name, t1.price,
coalesce(count(distinct t2.name) + 1, 1)
from my_table t1 join
my_table t2
on t2.name = t1.name and
t2.price < t1.price
order by t1.name, t1.price;

关于sql - 在不使用 ROW_NUMBER() OVER 函数的情况下获取分区内行(等级)的序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23425484/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com