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

时间:2015-03-10 10:42:14

标签: sql sql-server-2008 row-number case-when dense-rank

这是我根据qty outer_index_group获得的dense_rank获得col1(数量)的任务来自 col2col3row_number col1的,col2col3 和inner_index_group。

这里有规则:

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

2-如果col4只有4055,则直接从该行获取数据。

example data

结果就是这样 enter image description here

你觉得我会怎么做?我正在考虑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

1 个答案:

答案 0 :(得分:0)

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()over(...,col4 desc)。它会将最高等级1分配给col1,col2,col3的每个分区中具有最大值的行。所以,如果在分区中有col4 = 4086的行,它们将获得等级1,其余的col4 = 4055获得等级2;如果某些分区中没有显示此类行,则col4 = 4055的行将在此处获得排名。

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

rank()可以用row_number()替换