You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle数据库渐进式SELECT查询:5组等额欠款账户分组实现

Oracle 渐进式均匀分组选取账户方案

针对5000个按欠款降序排列的账户,要分成5组每组1000个,且每组总欠款金额相近的需求,采用循环分配式抽样(类似等差数列间隔选取)的方法,具体实现如下:

核心思路

避免按连续行号分组(会导致第一组全是高欠款账户,总和远超其他组),而是将排序后的账户按“1→组1、2→组2、…5→组5、6→组1”的循环方式分配,让每组均匀覆盖高、中、低欠款层级,确保各组总欠款接近。

具体SQL实现

1. 生成带排序行号的数据集

先给所有账户按欠款降序分配连续行号:

WITH ranked_accounts AS (
    SELECT 
        account_id, 
        overdue_amount,
        ROW_NUMBER() OVER (ORDER BY overdue_amount DESC) AS rn
    FROM loan_accounts
)

2. 分配分组ID并选取数据

通过行号对组数取模的方式生成分组ID,实现循环分配:

SELECT 
    account_id,
    overdue_amount,
    MOD(rn - 1, 5) + 1 AS group_id
FROM ranked_accounts
ORDER BY group_id, rn;
  • 逻辑说明:MOD(rn - 1, 5)会得到0-4的余数,加1后映射为1-5的组号,确保每5个连续行号对应1-5组,循环往复。

3. 单独提取某一组数据

如果需要单独获取某一组(例如第3组),只需添加WHERE条件:

SELECT account_id, overdue_amount
FROM ranked_accounts
WHERE MOD(rn - 1, 5) + 1 = 3;

4. 验证各组总欠款差异

可执行以下SQL统计每组的账户数量和总欠款,确认分配效果:

SELECT 
    group_id,
    COUNT(*) AS account_count,
    SUM(overdue_amount) AS total_overdue
FROM (
    SELECT 
        account_id, 
        overdue_amount,
        MOD(ROW_NUMBER() OVER (ORDER BY overdue_amount DESC) - 1, 5) + 1 AS group_id
    FROM loan_accounts
)
GROUP BY group_id
ORDER BY group_id;

方案优势

  • 完美支持任意组数的扩展(只需修改MOD函数的第二个参数),解决了奇偶行仅支持2组的局限;
  • 各组欠款总和差异极小,符合业务需求;
  • 实现简单,仅依赖基础的窗口函数和数学函数,性能高效。

内容的提问来源于stack exchange,提问作者LiamBotham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:50:28