SELECT ce.provider_id AS 机构编码, SUM(sub.sc...
作成日: 2026年1月21日
作成日: 2026年1月21日
SELECT
ce.provider_id AS 机构编码,
SUM(sub.scan_count) AS 扫描数量,
MAX(sub.last_time) AS 最近一次扫描时间
FROM (
SELECT
campaign_id,
COUNT(*) AS scan_count,
MAX(record_create_time) AS last_time
FROM (
SELECT campaign_id, record_create_time FROM scan_record_entity_0
UNION ALL
SELECT campaign_id, record_create_time FROM scan_record_entity_1
UNION ALL
SELECT campaign_id, record_create_time FROM scan_record_entity_2
UNION ALL
SELECT campaign_id, record_create_time FROM scan_record_entity_3
) AS combined
GROUP BY campaign_id
) AS sub
LEFT JOIN campaign_entity ce
ON sub.campaign_id = ce.id
GROUP BY ce.provider_id
这是我 目前的sql,这个库中还有一个表是campaign_entity,我需要统计这个比表中的id,然后把统计出来的值作为活动总数
你现在这条 SQL 是按 scan_record 里出现过的 campaign_id 去聚合,再关联 campaign_entity,最终按 provider_id 汇总扫描数和最近扫描时间。
你说“还要统计 campaign_entity 这个表中的 id,把统计出来的值作为活动总数”,一般有两种口径,我都给你写好(你直接选一种用)。
campaign_entity 里一共有多少个活动(不要求有扫描)活动总数 =
campaign_entity中该provider_id下的id数量
sqlSELECT ce.provider_id AS 机构编码, COUNT(ce.id) AS 活动总数, COALESCE(sr.扫描数量, 0) AS 扫描数量, sr.最近一次扫描时间 FROM campaign_entity ce LEFT JOIN ( SELECT ce2.provider_id, SUM(sub.scan_count) AS 扫描数量, MAX(sub.last_time) AS 最近一次扫描时间 FROM ( SELECT campaign_id, COUNT(*) AS scan_count, MAX(record_create_time) AS last_time FROM ( SELECT campaign_id, record_create_time FROM scan_record_entity_0 UNION ALL SELECT campaign_id, record_create_time FROM scan_record_entity_1 UNION ALL SELECT campaign_id, record_create_time FROM scan_record_entity_2 UNION ALL SELECT campaign_id, record_create_time FROM scan_record_entity_3 ) combined GROUP BY campaign_id ) sub JOIN campaign_entity ce2 ON sub.campaign_id = ce2.id GROUP BY ce2.provider_id ) sr ON ce.provider_id = sr.provider_id GROUP BY ce.provider_id, sr.扫描数量, sr.最近一次扫描时间;
特点: 哪怕某个机构的活动从来没人扫过,也会展示出来(扫描数量为 0)。
活动总数 = 扫描记录里去重后的
campaign_id数量(按机构)
sqlSELECT ce.provider_id AS 机构编码, COUNT(DISTINCT sub.campaign_id) AS 活动总数, SUM(sub.scan_count) AS 扫描数量, MAX(sub.last_time) AS 最近一次扫描时间 FROM ( SELECT campaign_id, COUNT(*) AS scan_count, MAX(record_create_time) AS last_time FROM ( SELECT campaign_id, record_create_time FROM scan_record_entity_0 UNION ALL SELECT campaign_id, record_create_time FROM scan_record_entity_1 UNION ALL SELECT campaign_id, record_create_time FROM scan_record_entity_2 UNION ALL SELECT campaign_id, record_create_time FROM scan_record_entity_3 ) combined GROUP BY campaign_id ) sub LEFT JOIN campaign_entity ce ON sub.campaign_id = ce.id GROUP BY ce.provider_id;
特点: 只统计“发生过扫描的活动”,没扫描过的活动不会计入活动总数。
如果你还需要加条件(比如只统计某个时间段的扫描、或 campaign_entity 里有状态字段只算“上线/有效”活动),把字段名/条件贴一下,我直接帮你把 WHERE 条件嵌进去。
SELECT
COUNT(DISTINCT p.id) AS 采集人次,
COUNT(DISTINCT pe.source_id ) FILTER (WHERE pe.event_type IN (1, 3)) AS 生成报告数(id去重),
SUM(CASE WHEN pe.event_type = 2 THEN 1 ELSE 0 END) AS 查看小程序报告数(id去重),
SUM(CASE WHEN pe.event_type = 3 THEN 1 ELSE 0 END) AS 分享至小程序数(id去重),
SUM(CASE WHEN pe.event_type = 5 THEN 1 ELSE 0 END) AS 预约意向数(id去重)
FROM patient p
LEFT JOIN patient_event pe ON (pe.patient_id = p.id AND pe.status = 0)
WHERE p.status = 0 AND (
'tenantId'
);
这个是之前生成报告数和查看小程序报告数的sql,你帮我把这个sql修改为可以用grafana拼接的sql。我需要增加的列是生成报告数,分享至小程序数,查看小程序报告数,预约意向数
下面给你一版 Grafana 里可直接用的 SQL(支持变量 + 时间筛选 + 可按机构维度展示),并且把你要的 4 个指标都做成 “source_id 去重” 口径:
说明:你原 SQL 里“查看/分享/预约”用的是 SUM(CASE...),那不是去重;这里我按你写的“(id去重)”统一改为
COUNT(DISTINCT ...) FILTER (...)。
$tenantId= Grafana 变量;时间用 Grafana 的宏(假设事件时间字段是pe.record_create_time,你按真实字段替换)。
sqlSELECT COUNT(DISTINCT p.id) AS "采集人次", COUNT(DISTINCT pe.source_id) FILTER (WHERE pe.event_type IN (1, 3)) AS "生成报告数", COUNT(DISTINCT pe.source_id) FILTER (WHERE pe.event_type = 3) AS "分享至小程序数", COUNT(DISTINCT pe.source_id) FILTER (WHERE pe.event_type = 2) AS "查看小程序报告数", COUNT(DISTINCT pe.source_id) FILTER (WHERE pe.event_type = 5) AS "预约意向数" FROM patient p LEFT JOIN patient_event pe ON pe.patient_id = p.id AND pe.status = 0 AND $__timeFilter(pe.record_create_time) -- ⬅️ 替换成你的事件时间字段 WHERE p.status = 0 AND ( '$tenantId' = 'All' OR p.provider_id::text = '$tenantId' -- provider_id 若是字符串就去掉 ::text );
sqlSELECT p.provider_id AS "机构编码", COUNT(DISTINCT p.id) AS "采集人次", COUNT(DISTINCT pe.source_id) FILTER (WHERE pe.event_type IN (1, 3)) AS "生成报告数", COUNT(DISTINCT pe.source_id) FILTER (WHERE pe.event_type = 3) AS "分享至小程序数", COUNT(DISTINCT pe.source_id) FILTER (WHERE pe.event_type = 2) AS "查看小程序报告数", COUNT(DISTINCT pe.source_id) FILTER (WHERE pe.event_type = 5) AS "预约意向数" FROM patient p LEFT JOIN patient_event pe ON pe.patient_id = p.id AND pe.status = 0 AND $__timeFilter(pe.record_create_time) WHERE p.status = 0 AND ( '$tenantId' = 'All' OR p.provider_id::text = '$tenantId' ) GROUP BY p.provider_id ORDER BY p.provider_id;
pe.record_create_time 是不是你事件表的时间字段?如果不是,把字段名换掉即可。provider_id 在 patient 表还是 campaign 表?你这条里用的是 patient 的 provider_id,我也按这个写了。如果你把 patient_event 的时间字段名贴一下(比如 create_time / event_time / record_create_time),我可以把两条 SQL 都改成完全匹配你库的版本。