SQL技术问题:如何解决STRING_AGG聚合重复药物名称的问题
解决STRING_AGG出现重复药物的问题
你的查询核心问题在于:虽然用了DISTINCT,但如果同一药物在同一个GroupNum分组下存在不同的StartDate/EndDate记录,DISTINCT会保留这些不同的行,导致STRING_AGG拼接时重复输出同一药物名称。由于早期SQL版本中STRING_AGG不支持直接加DISTINCT,我们需要提前对分组内的药物做去重处理。
修改后的完整SQL
WITH TreatmentCTE AS ( SELECT PatientId, DrugName, StartDate, EndDate, ROW_NUMBER() OVER (PARTITION BY PatientId ORDER BY StartDate) - ROW_NUMBER() OVER (PARTITION BY PatientId, DrugName ORDER BY StartDate) AS GroupNum FROM Exercise ), DistinctDrugs AS ( -- 按患者、分组、药物维度去重,同时聚合单药的起止日期 SELECT PatientId, GroupNum, DrugName, MIN(StartDate) AS DrugStart, MAX(EndDate) AS DrugEnd FROM TreatmentCTE GROUP BY PatientId, GroupNum, DrugName ) SELECT PatientId, STRING_AGG(DrugName, '+') AS Treatment, MIN(DrugStart) AS StartDate, MAX(DrugEnd) AS EndDate FROM DistinctDrugs GROUP BY PatientId, GroupNum ORDER BY PatientId, StartDate;
关键说明
- 提前去重:在
DistinctDrugsCTE中,通过GROUP BY PatientId, GroupNum, DrugName确保每个治疗分组内的药物唯一,从根源避免重复拼接。 - 日期聚合:对单药的起止日期取最小/最大值,保证后续外层聚合时能得到整个治疗周期的准确时间范围。
- 兼容性提示:如果使用SQL Server 2022及以上版本,可直接简化为
STRING_AGG(DISTINCT DrugName, '+'),无需额外去重步骤。
内容的提问来源于stack exchange,提问作者George B
相关产品推荐
相关产品推荐

