【问题标题】:NTILE SQL bucket ONLY 4 matches not 2NTILE SQL 存储桶只有 4 个匹配而不是 2
【发布时间】:2019-11-13 12:51:07
【问题描述】:

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

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

【问题讨论】:

    标签: sql sql-server stored-procedures sql-server-2017


    【解决方案1】:

    不要使用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()(或相关函数)并对其进行算术运算。我更喜欢明确计算。

    【讨论】:

      猜你喜欢
      • 2017-10-30
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      相关资源
      最近更新 更多