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

case when based on group dense_rank() value and row_number() value

这是一项任务,我根据从 dense_rank [=16 获得的 outer_index_group 获得 qty(数量) =]、col2col3 和 inner_index_group 来自 col1row_numbercol2col3.

这里的规则:

1) 在每个 outer_index_group 内,如果 col4 有 4055 和 4086,qty 我应该在行 [=26] =] 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() over (..., col4 desc)。它会将最高排名 1 分配给 col1、col2、col3 的每个分区中具有最大值的行。因此,如果分区中有 col4=4086 的行,它们将获得排名 1,其余的 col4=4055 获得排名 2;如果这些行没有出现在某些分区中,则 col4=4055 的行将在那里获得排名 1。

如果每个分区只需要 1 行,

rank() 可以用 row_number() 代替(rank() 可以将 rnk=1 分配给多行)