sql - SQL查找通过所有事件的候选人
问题描述
我有一个无法构建查询的 SQL 问题:我有 3 个表,一个列出候选表(由 c_id 索引),一个用于事件(由 event_id、FK c_id 索引,并且有 event_type 列和 raw_score 列) 和另一个分数“查找”表(包含 event_type、raw_score 和 scaled_score 列)。
我真正想回答的问题是找到所有通过所有 4 种不同事件类型的候选人(一个是二进制的,其余的需要 70 分)。
我想出的解决方案涉及一个使用 having 子句的 CTE,以及第二个在该表中按 id 分组的 CTE,计算每个组中的行数并仅返回计数至少为 3 的行。这个问题是它没有明确检查 3 个不同的事件,只是计数至少为 3,但候选人可能有 3 个相同事件类型的行。我应该怎么办?
WITH candidates (brandi_id) AS (
SELECT e.brandi_id
FROM event AS e
LEFT JOIN apf_score_lookup AS ss
ON ss.asmnt_code = e.asmnt_code
AND ss.raw_score = e.score
GROUP BY e.brandi_id, e.asmnt_code, ss.scaled_score
HAVING e.asmnt_code IN ('APFPS','APFSU','APF2M')
AND ss.scaled_score >= 70
)
SELECT candidates.brandi_id
FROM candidates
LEFT JOIN event AS e
ON e.brandi_id = candidates.brandi_id
WHERE e.asmnt_code = 'APFPL'
AND e.score > 0
GROUP BY candidates.brandi_id
HAVING count(candidates.brandi_id) >= 3;
解决方案
您可以使用聚合:
select sl.brandi_id
from apf_score_lookup sl join
event e
on ss.asmnt_code = e.asmnt_code and
ss.raw_score = e.score
where e.asmnt_code IN ('APFPS', 'APFSU', 'APF2M') and
ss.scaled_score >= 70
group by sl.brandi_id
having count(distinct e.asmnt_code) = 3;
推荐阅读
- c# - 如何提高枚举 JSON 文件的可读性?
- vue.js - 如何在 localhost 中使用 cli-plugin-pwa 和 workbox
- c# - 如果缺少指定的配置,msbuild 如何决定使用哪个配置?
- javascript - 谷歌浏览器通过Javascript或控制台选择所有复选框
- python - Python 字典的行为:fromkeys 与字典理解
- r - 用新数据重新训练随机森林
- java - 用于 CRUD 应用程序的 ViewModel
- firebase - Firestore 侦听器在将新项目添加到列表时触发两项更改
- flutter - FileSystemException (FileSystemException: Creation failed, path = '/sdcard/you' (OS Error: Operation not allowed, errno = 1))
- arrays - 从指针数组中提取 C 中字符串的一部分