sql - 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
有谁知道如何解决我的问题?
解决方案
不要使用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()
(或相关函数)并对其进行算术运算。我更喜欢明确计算。
推荐阅读
- excel-formula - Excel 公式:SUM 与 ROW 的正确语法?
- scala - 如何向函数提取摘要添加类型检查
- video - FFmpeg 屏幕混合模式将图像变为粉红色
- javascript - 函数内部的for循环以查找匹配的值javascript
- android - 使用改造和 rxJava 重复 api 调用
- c++ - 如何验证 do...while 循环中的输入,然后在必要时重新提问?
- pandas - Pandas - 根据多个条件将值分配给空列
- python - 无法创建 cudnn 句柄:CUDNN_STATUS_ALLOC_FAILED 但设置内存增长为真
- arrays - 如何将数组的返回类型强制到打字稿函数上
- sql - Redshift 获取 Json 密钥