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

如何编写T-SQL查询按ID1及Rank顺序分配数量至Reference值

T-SQL实现按优先级分配额度的查询

示例数据

ID1ID2RankToAllocateReferenceResult
xxxa1100350100
xxxb2200350200
xxxc310035050
yyya14010040
yyyb27010060
yyyc3101000

需求说明

按ID1分组,以Rank为优先级顺序分配ToAllocate数值,每组的总分配上限为Reference值:

  • 优先满足Rank靠前的记录
  • 剩余可分配额度足够时,Result取ToAllocate的数值
  • 剩余额度不足时,Result取剩余额度
  • 额度耗尽后,后续记录Result为0

解决方案代码

SELECT 
    ID1,
    ID2,
    Rank,
    ToAllocate,
    Reference,
    Result = GREATEST(
        0,
        LEAST(
            ToAllocate,
            Reference - ISNULL(SUM(ToAllocate) OVER (PARTITION BY ID1 ORDER BY Rank ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0)
        )
    )
FROM 
    YourTableName -- 替换成你的实际表名
ORDER BY 
    ID1, Rank;

代码逻辑解释

  1. 累计已分配量计算:SUM(ToAllocate) OVER (PARTITION BY ID1 ORDER BY Rank ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) 计算当前记录之前所有已分配的总量,用ISNULL处理组内第一条记录的NULL情况(此时累计量为0)。
  2. 剩余额度计算:用Reference减去累计已分配量,得到当前记录可使用的剩余额度。
  3. 分配值确定:用LEAST取ToAllocate和剩余额度的较小值,确保不超过总上限;再用GREATEST确保结果不会为负数(额度耗尽时取0)。

替代写法(SQL Server 2022+)

如果使用SQL Server 2022及以上版本,可简化累计量的计算:

SELECT 
    ID1,
    ID2,
    Rank,
    ToAllocate,
    Reference,
    Result = GREATEST(
        0,
        LEAST(
            ToAllocate,
            Reference - (SUM(ToAllocate) OVER (PARTITION BY ID1 ORDER BY Rank) - ToAllocate)
        )
    )
FROM 
    YourTableName
ORDER BY 
    ID1, Rank;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:41:06