Oracle中按分组为ITEM_MASTER表各25%记录分配RANGE值1-4的方法
Oracle按分组均匀分配RANGE字段值的实现方案
可以通过Oracle的NTILE()窗口函数实现该需求,NTILE(n)会将每个分组内的记录尽量均匀划分为n个部分,正好匹配你需要的4组各占25%的要求。
方法一:UPDATE结合子查询
UPDATE ITEM_MASTER t SET RANGE = ( SELECT ntile_val FROM ( SELECT ITEM, NTILE(4) OVER (PARTITION BY DEPT, CLASS, SUBCLASS ORDER BY ITEM) AS ntile_val FROM ITEM_MASTER ) s WHERE s.ITEM = t.ITEM );
方法二:MERGE语句(大数据量场景更高效)
MERGE INTO ITEM_MASTER t USING ( SELECT ITEM, NTILE(4) OVER (PARTITION BY DEPT, CLASS, SUBCLASS ORDER BY ITEM) AS ntile_val FROM ITEM_MASTER ) s ON (t.ITEM = s.ITEM) WHEN MATCHED THEN UPDATE SET t.RANGE = s.ntile_val;
关键说明
PARTITION BY DEPT, CLASS, SUBCLASS:按三个字段的组合分组,确保每个分组独立划分区间NTILE(4):将每组记录划分为4个近似相等的部分,各部分占比约25%ORDER BY ITEM:指定分组内的排序依据,保证划分逻辑稳定;若需要随机分配,可替换为ORDER BY DBMS_RANDOM.VALUE
内容的提问来源于stack exchange,提问作者Imran Hemani
相关产品推荐
相关产品推荐

