如何用单条T-SQL脚本生成关联双列的客户ID与独立患者ID
当然可以用单条T-SQL语句搞定!咱们借助CTE(公共表表达式)就能把整个流程串起来,不用依赖存储过程。下面直接上解决方案,我会一步步给你解释逻辑:
单条T-SQL实现脚本
WITH ClientCTE AS ( -- 第一步:提取唯一的客户组合,生成自增的Client ID SELECT DISTINCT [Client First Name], [Client Last Name], ROW_NUMBER() OVER (ORDER BY [Client First Name], [Client Last Name]) AS [Client ID] FROM ( -- 替换成你的实际表名,或者保留这个VALUES子句直接用原始数据 VALUES ('John', 'Wick', 'Raffie'), ('John', 'Wick', 'Coco'), ('Rick', 'Thomas', 'Sussie'), ('Peter', 'Parker', 'Hershey'), ('Peter', 'Parker', 'Malt'), ('Rick', 'Thomas', 'Poky'), ('Lucas', 'Desmond', 'Timmy') ) AS RawData([Client First Name], [Client Last Name], [Patient Name]) ), PatientCTE AS ( -- 第二步:关联客户ID,生成全局唯一的Patient ID SELECT c.[Client ID], c.[Client First Name], c.[Client Last Name], rd.[Patient Name], ROW_NUMBER() OVER (ORDER BY c.[Client ID], rd.[Patient Name]) AS [Patient ID] FROM ( -- 同样替换成你的实际表名,或者保留原始数据的VALUES子句 VALUES ('John', 'Wick', 'Raffie'), ('John', 'Wick', 'Coco'), ('Rick', 'Thomas', 'Sussie'), ('Peter', 'Parker', 'Hershey'), ('Peter', 'Parker', 'Malt'), ('Rick', 'Thomas', 'Poky'), ('Lucas', 'Desmond', 'Timmy') ) AS RawData([Client First Name], [Client Last Name], [Patient Name]) JOIN ClientCTE c ON rd.[Client First Name] = c.[Client First Name] AND rd.[Client Last Name] = c.[Client Last Name] ) -- 最终输出符合要求的结果 SELECT [Client ID], [Client First Name], [Client Last Name], [Patient Name], [Patient ID] FROM PatientCTE ORDER BY [Patient ID];
逻辑说明
- ClientCTE部分:先对客户的
First Name + Last Name组合去重,用ROW_NUMBER()生成从1开始的唯一Client ID,排序规则可以根据你的需求调整(比如按姓名排序)。 - PatientCTE部分:把原始的每条患者记录和ClientCTE关联,拿到对应的Client ID,再用
ROW_NUMBER()生成全局连续的Patient ID(这里按Client ID+患者姓名排序,保证ID顺序和你期望的一致;如果不需要特定顺序,也可以用ORDER BY (SELECT NULL),但建议指定明确排序规则避免ID顺序不稳定)。 - 最终查询直接输出整理好的结果,完全匹配你要的格式。
注意事项
如果你的数据已经存储在物理表/临时表中,只需要把两个VALUES代码块替换成FROM YourActualTableName即可,不用重复写原始数据。
内容的提问来源于stack exchange,提问作者Byron Louise Hudkin Festin
相关产品推荐
相关产品推荐

