0

这是我被赋予的一项任务,以根据我从,和 inner_index_group的, ,qty获得的(数量) 。outer_index_groupdense_rank col1col2col3row_numbercol1col2col3

这里的规则:

1)在每个里面outer_index_group,如果col4有 4055 和 4086,qty我应该得到在第inner_index_group4086 行,通常在inner_index_group3 或 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
4

1 回答 1

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。

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

于 2015-03-10T18:54:07.923 回答