基于组 dense_rank() 值和 row_number() 值的情况
case when based on group dense_rank() value and row_number() value
这是一项任务,我根据从 dense_rank
[=16 获得的 outer_index_group
获得 qty
(数量) =]、col2
、col3
和 inner_index_group 来自 col1
的 row_number
、col2
、col3
.
这里的规则:
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 分配给多行)
这是一项任务,我根据从 dense_rank
[=16 获得的 outer_index_group
获得 qty
(数量) =]、col2
、col3
和 inner_index_group 来自 col1
的 row_number
、col2
、col3
.
这里的规则:
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 分配给多行)