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

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;

关键说明

  1. 提前去重:在DistinctDrugs CTE中,通过GROUP BY PatientId, GroupNum, DrugName确保每个治疗分组内的药物唯一,从根源避免重复拼接。
  2. 日期聚合:对单药的起止日期取最小/最大值,保证后续外层聚合时能得到整个治疗周期的准确时间范围。
  3. 兼容性提示:如果使用SQL Server 2022及以上版本,可直接简化为STRING_AGG(DISTINCT DrugName, '+'),无需额外去重步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:18:28