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

Add column to count number of sub values under main value

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

我试过 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

感谢任何帮助

您可以将 count(distinct) 用作 window 函数:

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

虽然是标准功能,但并非所有数据库都支持 window 中的 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;

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

您可以按如下方式使用连接:

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