ntile
NTILE(n),用于将分组数据按照顺序切分成n片,返回当前切片值。将一个有序的数据集划分为多个桶(bucket),并为每行分配一个适当的桶数(切片值,第几个切片,第几个分区等概念)。它可用于将数据划分为相等的小切片,为每一行分配该小切片的数字序号。
NTILE不支持ROWS BETWEEN,比如NTILE(2) OVER(PARTITION BY dept_no ORDER BY salary ROWS BETWEEN 3 PRECEDING - AND CURRENT ROW)。
如果切片不均匀,默认增加第一个切片的分布。
例如:
SELECT name, dept_no, salary, ntile(2) over(order by salary) n1,-- 全局按照salary升序排列,数据切成2份 ntile(2) over(partition by dept_no order by salary) n2, -- 按照dept_no分组,在分组内按照salary升序排列,数据切成2份 ntile(3) over(partition by dept_no order by salary) n3 -- 按照dept_no分组,在分组内按照salary升序排列,数据切成3份 FROM data;
讯享网
这个函数用什么应用场景呢?假如我们想要统计一个cookie,pv数最多的前1/3的天。
讯享网SELECT id, date, pv, NTILE(3) OVER(PARTITION BY id ORDER BY pv DESC) AS rn FROM data;
rn = 1的记录,就是我们想要的结果。
+---+----------------+---+---+ |id |date |pv |rn | +---+----------------+---+---+ |1 |2015-04-12 |7 |1 | |1 |2015-04-11 |5 |2 | |1 |2015-04-10 |1 |3 | |2 |2015-04-14 |4 |1 | |2 |2015-04-15 |4 |2 | |2 |2015-04-13 |3 |3 | |3 |2015-04-16 |4 |1 | +---+----------------+---+---+
注意:NTILE、ROW_NUMBER、RANK、DENSE_RANK等序列函数不支持window子句。
欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/69132.html