SQL Server实现1-7循环分组 同Site_ID分配相同编码
SQL Server 同站点固定1-7循环编码实现方案
核心逻辑
要满足「相同Site_ID编码完全一致、编码1~7按顺序循环分配」的要求,不需要逐行遍历,分两步处理即可:
- 第一步:先把所有唯一的
Site_ID去重,按照站点在数据中首次出现的先后顺序,生成从1开始的连续排名 - 第二步:对连续排名做取模运算,转换为1~7区间的循环编码,再关联回原表,给所有对应站点的行统一赋值即可
可直接运行的代码
假设你的原始数据表名为Your_Table,替换成实际表名即可使用:
WITH Site_Seq_Tmp AS ( -- 为每个唯一站点生成首次出现顺序的连续序号 SELECT Site_ID, DENSE_RANK() OVER ( -- 如果你有明确的排序依据(比如数据采集时间、自增ID),替换下面ORDER BY的字段即可 ORDER BY MIN(Individual_ID), MIN(%%physloc%%) ) AS Site_Seq FROM Your_Table GROUP BY Site_ID ), Site_Code_Tmp AS ( -- 将连续序号转换为1-7循环的编码值 SELECT Site_ID, CASE WHEN Site_Seq % 7 = 0 THEN 7 ELSE Site_Seq % 7 END AS Code_Assignment FROM Site_Seq_Tmp ) -- 关联回原表输出最终结果 SELECT t.Individual_ID, t.Site_ID, sct.Code_Assignment FROM Your_Table t INNER JOIN Site_Code_Tmp sct ON t.Site_ID = sct.Site_ID
注意事项
如果你有明确的业务排序规则(比如按站点首次上报时间、数据入库自增ID排序),请将代码中
DENSE_RANK()窗口函数的ORDER BY子句替换为对应的排序字段,即可保证站点顺序和业务预期完全一致。你给出的样例中编码从3直接跳到5,是因为排序第4位的站点对应的行没有出现在你截取的样例片段中,上述代码会自动覆盖全量站点,编码循环逻辑不会出错。
内容的提问来源于stack exchange,提问作者Jay_C_NNJ
相关产品推荐
相关产品推荐

