在子查询上使用row_number over返回的rn都是1

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

在子查询上使用row_number over返回的rn都是1

star
如果直接查询表是没问题,但是业务需求是按汇总后的amount排序,所以有一个from子查询,请问有没有什么方法汇总后求topN

select id,province,amount,rn from(
select
id,province,amount,
row_number() over(partition by province order by amount desc ) as rn
from (
        select id,province,sum(amount) amount from mytable group by id,province
        )m
)a where rn<=5
;

返回结果:

1> (true,id001,浙江,1505.66,1)
2> (true,id001,其他,3384.91,1)
7> (true,id001,北京,365.87,1)
3> (true,id001,天津,310.38,1)
7> (false,id001,北京,365.87,1)
7> (true,id001,北京,676.25,1)
7> (false,id001,北京,676.25,1)
7> (true,id001,北京,978.14,1)
7> (true,id001,广东,329.25,1)
7> (false,id001,广东,329.25,1)


如果直接查询表是没问题:
select id,province,amount,rn from(
select
id,province,amount,
row_number() over(partition by province order by amount desc ) as rn
from mytable
)a where rn<=5
;

7> (true,id001,北京,310.38,2)
6> (true,id001,湖北,344.34,1)
8> (true,id001,山东,348.11,1)
3> (true,id001,四川,7283.02,2)
7> (true,id001,北京,301.89,3)
3> (false,id001,四川,1128.3,2)
8> (true,id001,重庆,310.38,3)
3> (true,id001,四川,1128.3,3)
6> (true,id001,上海,647.55,1)
3> (false,id001,四川,310.38,3)
6> (false,id001,上海,310.38,1)
7> (true,id001,广东,329.25,1)
3> (true,id001,四川,310.38,4)
8> (true,id001,重庆,1618.87,1)
6> (true,id001,上海,310.38,2)
Reply | Threaded
Open this post in threaded view
|

Re: 在子查询上使用row_number over返回的rn都是1

Jark
Administrator
Hi,

你使用的是 flink 1.9 blink planner 吧?

首先你的 topn query 没有问题。结果也没有问题。
因为你是根据 province 分组求 top5,也就是每个省份排名前5的 id。但是现在你的数据中,每个省份只有一个 id,所以大家的排名都是1。
如果你想求全局前5名的省份,那么row_number 那里不需要定义 partition by province。

Best,
Jark


> 在 2019年8月27日,15:16,ddwcg <[hidden email]> 写道:
>
> 6> (true,id001,上海,647.55,1)

Reply | Threaded
Open this post in threaded view
|

Re: 在子查询上使用row_number over返回的rn都是1

star
谢谢回复,是我sql理解的问题,给您添麻烦了。
另外我还想问一下,这个retractstream后面接了一个process算子来维护top5的list,这个算子是不是还需要自己实现维护state的代码?


> 在 2019年8月28日,09:53,Jark Wu <[hidden email]> 写道:
>
> Hi,
>
> 你使用的是 flink 1.9 blink planner 吧?
>
> 首先你的 topn query 没有问题。结果也没有问题。
> 因为你是根据 province 分组求 top5,也就是每个省份排名前5的 id。但是现在你的数据中,每个省份只有一个 id,所以大家的排名都是1。
> 如果你想求全局前5名的省份,那么row_number 那里不需要定义 partition by province。
>
> Best,
> Jark
>
>
>> 在 2019年8月27日,15:16,ddwcg <[hidden email]> 写道:
>>
>> 6> (true,id001,上海,647.55,1)
>

Reply | Threaded
Open this post in threaded view
|

Re: 在子查询上使用row_number over返回的rn都是1

Jark
Administrator
为什么还需要后面接 process operator 呢? Flink TopN 已经帮你维护好了 state,直接输出到一个 update sink 中就可以了。


Best,
Jark

> 在 2019年8月28日,10:08,ddwcg <[hidden email]> 写道:
>
> process

Reply | Threaded
Open this post in threaded view
|

Re: 在子查询上使用row_number over返回的rn都是1

star
因为sink到hbase,使用一个column存了top5的list,sink前我要组合一下这个list

> 在 2019年8月28日,10:12,Jark Wu <[hidden email]> 写道:
>
> 为什么还需要后面接 process operator 呢? Flink TopN 已经帮你维护好了 state,直接输出到一个 update sink 中就可以了。
>
>
> Best,
> Jark
>
>> 在 2019年8月28日,10:08,ddwcg <[hidden email]> 写道:
>>
>> process
>