添加列以计算主值下的子值数

问题描述

我有一个如下的数据集示例,我想添加一个额外的列,以显示示例中块中子块的数量

我玩过 rown_number 但没有成功。 ROW_NUMBER() over (PARTITION BY BlockRef,SubBlockRef ORDER BY BlockRef,SubBlockRef DESC)

BlockRef    Blocks  SubBlockRef SubBlocks
37391   BLOCK   49391   SUBB
37391   BLOCK   49391   SUBB
37391   BLOCK   49391   SUBB
37391   BLOCK   49391   SUBB
37391   BLOCK   49391   SUBB
37391   BLOCK   49391   SUBB
37391   BLOCK   49392   SUBB
37391   BLOCK   49392   SUBB
37391   BLOCK   49392   SUBB
37391   BLOCK   49392   SUBB
37391   BLOCK   49392   SUBB
37391   BLOCK   49392   SUBB

enter image description here

感谢任何帮助

解决方法

您可以使用 count(distinct) 作为窗口函数:

select t.*,count(distinct SubBlockRef) over (partition by BlockRef) as num_subblocks
from t;

尽管是标准功能,但并非所有数据库都支持窗口函数中的 distinct。使用 dense_rank() 有一个简单的解决方法:

select t.*,( dense_rank() over (partition by BlockRef order by SubBlockRef) +
         dense_rank() over (partition by BlockRef order by SubBlockRef desc) - 1
       ) as num_subblocks
from t;

鉴于有如此简单的解决方法,令人惊讶的是许多数据库不支持该功能。

,

您可以按如下方式使用 join:

select t.*,Tt.cnt as num_subblocks
  from your_table t
  Join (select BlockRef,count(distinct SubBlockRef) as cnt
         From your_table 
        Group by BlockRef) tt
   On tt.BlockRef = t.BlockRef