首页 > 解决方案 > 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;

标签: sql

解决方案


您可以使用聚合:

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;

推荐阅读