首页 > 解决方案 > NTILE SQL 存储桶只有 4 个匹配而不是 2

问题描述

SQL NTILE() 函数有没有办法只对最大输入值进行分组?例如,当我使用 NTILE(4) 时,我不希望函数对具有 2 个或 3 个匹配项的值进行分组,而只对具有 4 个匹配项的值进行分组。

我很难做到这一点。

我的数据集看起来像这样

id timetraveled
1  5
1  5
1  5
1  5
2  6
2  6

我期待 NTILE(4) 返回以下内容:

ntile id timetraveled
1     1  5
2     1  5 
3     1  5
4     1  5
1     2  6
1     2  6

但它会给我:

ntile id timetraveled
1     1  5
2     1  5 
3     1  5
4     1  5
1     2  6
*2*   2  6

有谁知道如何解决我的问题?

标签: sqlsql-serverstored-proceduressql-server-2017

解决方案


不要使用ntile(). 你可以自己计算:

select t.*,
       (case when seqnum <= 0.25 * cnt then 1
             when seqnum <= 0.50 * cnt then 2
             when seqnum <= 0.75 * cnt then 3
             else 4
        end) as ntile,
       floor(1 + ((seqnum - 1) * 4 / cnt)) as ntile_2
from (select t.*,
             row_number() over (partition by id order by timetravelled) as seqnum,
             count(*) over (partition by id) as cnt
      from t
     ) t;

这有两种不同的方法来计算您想要的“ntile”值。

您也可以使用percentile()(或相关函数)并对其进行算术运算。我更喜欢明确计算。


推荐阅读