繁体   English   中英

基于组density_rank()值和row_number()值的情况

[英]case when based on group dense_rank() value and row_number() value

这是我要给出的任务,它是基于我从dense_rank col1col2col3和inner_index_group从col1col2col3 row_number获得的outer_index_group获得qty (数量)的。

规则如下:

1)在每个outer_index_group内部,如果col4具有4055和4086,则我应该得到的qty是在inner_index_group 4086行中,该行通常在inner_index_group 3或2中。

2-否则,如果col4只有4055,则直接从行中获取数量。

示例数据

结果将是这样 在此处输入图片说明

您认为我要怎么做? 我正在考虑什么case when但是我不知道如何处理这种情况。

非常感谢你。

    SELECt col1,col2,col3,col4,qty
         ,dense_rank() over (order by col1,col2,col3) as outer_index_group
   , ROW_NUMBER() over (partition by col1,col2,col3 order by col1,col2,col3) as      inner_index_group from table
select * from
(
    select col1,col2,col3,col4,qty
          ,dense_rank() over (order by col1,col2,col3) as outer_index_group
          ,row_number() over (partition by col1,col2,col3 order by col1,col2,col3) as      inner_index_group
          ,RANK() over (partition by col1,col2,col3 order by col1,col2,col3,col4 desc) as rnk
          from myTable
) T
where rnk = 1

重要的是此处的Rank()(...,col4 desc)。 它将为col1,col2,col3的每个分区中具有最大值的行分配最高等级1。 因此,如果分区中有col4 = 4086的行,它们将获得排名1,而col4 = 4055的其余行将获得排名2; 如果在某些分区中未显示此类行,则col4 = 4055的行将在那里获得等级1。

如果每个分区只需要1行,可以用row_number()代替rank()(rank()可以将rnk = 1分配给多行)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM