簡體   English   中英

Q1&Q2的sql查詢?

[英]sql query for Q1&Q2?

Q1:確定所有有資格擔任職位的候選人及其職位
Q2:確定所有有資格擔任特定職位的候選人,以及他們的職位(即沒有多余的技能)

create table JobSkills (
   job char(20),
   skill char(20),
   primary key(job, skill)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

create table Candidates (
   candidate char(20),
   skill char(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into JobSkills values
('DB Architect','SQL'),
('DB Architect','DB Design'),
('DB Architect','Python'),
('DB Architect','Team Player'),
('DB Architect','Passionate'),
('Front End Developer','JAVA'),
('Front End Developer','C#'),
('Front End Developer','Team Player'),
('Front End Developer','Passionate'),
('Office Manager','Passionate'),
('Office Manager','Office');

insert into Candidates values
('Ami', 'SQL'),
('Ami', 'DB Design'),
('Ami', 'Team Player'),
('Ami', 'Passionate'),
('Xi', 'SQL'),
('Xi', 'Python'),
('Xi', 'DB Design'),
('Xi', 'Team Player'),
('Xi', 'Passionate'),
('DJ', 'JAVA'),
('DJ', 'C#'),
('DJ', 'Team Player'),
('DJ', 'Passionate'),
('DJ', 'Python'),
('Steve', 'Passionate'),
('Steve', 'Leader'),
('Darrin', 'SQL'),
('Darrin', 'DB Design'),
('Darrin', 'C#'),
('Darrin', 'Python'),
('Darrin', 'JAVA'),
('Darrin', 'Office'),
('Darrin', 'Team Player'),
('Darrin', 'Leader'),
('Darrin', 'Passionate');

我認為當候選人至少具備工作/職位所需的所有技能時,他/她就是“合格的”。

那么對於第一個問題,我知道候選人可以擁有比預期更多的技能。

為此,帶有HAVING子句的GROUP BY 應該可以解決問題。
一份工作的總技能應該等於候選人的匹配技能。

-- Q1: Identify all candidates who are qualified for a position
--     and their positions
--
SELECT c.candidate, j.job AS position
FROM JobSkills AS j
JOIN Candidates AS c ON c.skill = j.skill
JOIN 
(
   SELECT job, COUNT(DISTINCT skill) AS TotalSkills 
   FROM JobSkills 
   GROUP BY job
) jobtot ON jobtot.job = j.job
GROUP BY c.candidate, j.job
HAVING COUNT(DISTINCT c.skill) = MAX(jobtot.TotalSkills)
ORDER BY c.candidate, j.job, COUNT(DISTINCT c.skill) DESC;

結果:

candidate   job
---------   --------------------
Darrin      DB Architect
Darrin      Front End Developer
Darrin      Office Manager
DJ          Front End Developer
Xi          DB Architect

但對於第二個我的理解是,候選人不能擁有工作不需要的任何額外技能。

然后就有點復雜了。
因為那時候選人的總技能也必須混合在一起。

-- Q2: Identify all candidates who are qualified for a particular position
--     and the their position (i.e., no redundant skills)
--
SELECT cj.candidate, cj.job AS position
FROM 
(
  SELECT c.candidate, j.job, 
   COUNT(DISTINCT c.skill) AS TotalMAtchingSkills 
  FROM Candidates c
  JOIN JobSkills j ON j.skill = c.skill
  GROUP BY c.candidate, j.job
) cj
JOIN
(
   SELECT candidate, 
    COUNT(DISTINCT skill) AS TotalSkills 
   FROM Candidates 
   GROUP BY candidate
) candtot ON candtot.candidate = cj.candidate 
         AND candtot.TotalSkills = cj.TotalMAtchingSkills
JOIN
(
   SELECT job, 
    COUNT(DISTINCT skill) AS TotalSkills 
   FROM JobSkills 
   GROUP BY job
) jobtot ON jobtot.job = cj.job
        AND jobtot.TotalSkills = cj.TotalMAtchingSkills
ORDER BY cj.candidate, cj.job;

結果:

candidate   job
----------  ------------
Xi          DB Architect

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM