如何按CustomerCode分组,筛选TOP(nbServer-nbImaging)条数据?
解决方案
可以通过ROW_NUMBER()窗口函数结合CTE实现需求,具体步骤如下:
- 先保留原有查询逻辑生成基础数据集
- 给每个
CustomerCode分组内的记录添加行号,同时计算需要提取的条数TakeCount(即nbServer - nbImaging) - 外层筛选行号不超过
TakeCount的记录,同时过滤掉差值为负的情况(避免取到无效数据)
完整SQL语句如下:
WITH BaseData AS ( SELECT CustomerCode, SUBSTRING(SerialNumber, CHARINDEX('-', SerialNumber) + 1, 6) AS SerialNumber, nbServer, ISNULL(nbImaging, 0) AS nbImaging FROM Magic WHERE CS_MagicNUmber <> I_MagicNumber OR CS_MagicNUmber IS NULL OR I_MagicNUmber IS NULL ), RankedData AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY CustomerCode ORDER BY SerialNumber) AS RowNum, (nbServer - nbImaging) AS TakeCount FROM BaseData ) SELECT CustomerCode, SerialNumber, nbServer, nbImaging FROM RankedData WHERE RowNum <= TakeCount AND TakeCount > 0;
关键说明
PARTITION BY CustomerCode:确保行号按客户分组单独计算ORDER BY SerialNumber:明确分组内的排序规则(可根据实际业务需求替换为其他字段,如创建时间等)TakeCount > 0:避免当nbServer小于nbImaging时,错误提取数据
内容的提问来源于stack exchange,提问作者Jean-Cédric Hamel
相关产品推荐
相关产品推荐

