如何按WearerID分组后根据BadgeType优先级合并剂量报告数据
如何按WearerID分组后根据BadgeType优先级合并剂量报告数据
嘿,这个需求在剂量监测数据处理里太常见了!我来给你拆解一下怎么实现——核心就是针对每个剂量字段,优先用对应专用徽章的数据,没有的话就 fallback 到Generic通用徽章的值。
下面给你两种实用的SQL写法,适配大多数主流数据库(比如MySQL、SQL Server、PostgreSQL这些):
方法一:条件聚合(最直观易懂)
这种方式直接通过分组+条件判断来提取对应优先级的值,逻辑清晰,维护起来也方便:
SELECT WearerID, -- 优先取DeepDose专用徽章的剂量,没有就用Generic的 COALESCE(MAX(CASE WHEN BadgeType = 'DeepDose' THEN DeepDose END), MAX(CASE WHEN BadgeType = 'Generic' THEN DeepDose END)) AS DeepDose, -- 优先取Eye专用徽章的剂量,没有就用Generic的 COALESCE(MAX(CASE WHEN BadgeType = 'Eye' THEN EyeDose END), MAX(CASE WHEN BadgeType = 'Generic' THEN EyeDose END)) AS EyeDose, -- ExtremityDose这里默认用Generic的(你没提对应专用徽章) MAX(CASE WHEN BadgeType = 'Generic' THEN ExtremityDose END) AS ExtremityDose FROM BadgeResults GROUP BY WearerID;
小解释:
CASE语句会精准筛选出对应BadgeType的剂量值,MAX在这里是为了把单个有效值提取出来(默认每个WearerID对应每种BadgeType只有一条记录对吧?)COALESCE函数会先尝试用前面的专用徽章值,要是没有(也就是该WearerID没有对应专用徽章),就自动用后面的Generic值。
方法二:窗口函数(更灵活,适合复杂场景)
如果之后你需要扩展更多徽章类型,或者要处理同类型多记录的情况,用窗口函数排序取优先级最高的值会更灵活:
WITH RankedBadges AS ( SELECT *, -- 给徽章类型设置优先级:专用徽章 > Generic通用徽章 CASE BadgeType WHEN 'Eye' THEN 1 WHEN 'DeepDose' THEN 1 WHEN 'Generic' THEN 2 END AS Priority FROM BadgeResults ) SELECT DISTINCT WearerID, -- 优先取DeepDose专用徽章的剂量 FIRST_VALUE(DeepDose) OVER ( PARTITION BY WearerID ORDER BY Priority, CASE WHEN BadgeType='DeepDose' THEN 1 ELSE 2 END ) AS DeepDose, -- 优先取Eye专用徽章的剂量 FIRST_VALUE(EyeDose) OVER ( PARTITION BY WearerID ORDER BY Priority, CASE WHEN BadgeType='Eye' THEN 1 ELSE 2 END ) AS EyeDose, -- ExtremityDose取优先级最高的(也就是Generic) FIRST_VALUE(ExtremityDose) OVER (PARTITION BY WearerID ORDER BY Priority) AS ExtremityDose FROM RankedBadges;
小提示:
要是某个WearerID可能有多个同类型的徽章记录(比如同一类型的多次报告),你可以在CTE的排序里加个日期字段,比如ORDER BY Priority, ReportDate DESC,这样就能取最新的报告数据啦。
备注:内容来源于stack exchange,提问作者AccessUser
相关产品推荐
相关产品推荐

