【问题标题】:SQL to find candidates who passed all eventsSQL查找通过所有事件的候选人
【发布时间】:2020-04-11 02:30:24
【问题描述】:

我有一个无法构造查询的 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


    【解决方案1】:

    你可以使用聚合:

    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;
    

    【讨论】:

    • 非常感谢!我不得不稍微修改一下,但这样就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多