2013-11-20 2 views
0

У меня есть таблица со списком кандидатов и связаны представлен с историей кандидатов статусов:Выберите строку, которая не сопровождается специфическими один

CandidateId FirstName LastName 
-------------------------------- 
1   User  One 
2   User  Two 

и

CandidateStatusId CandidateId Status   Timestamp 
-------------------------------------------------------- 
1     1   Assigned   ... 
2     1   Interviewed  ... 
3     1   Offer Accepted ... 

1     2   Assigned   ... 
2     2   Interviewed  ... 
3     2   Offer Accepted ... 
4     2   Hired   ... 
5     2   Bench   ... 
6     2   Hired   ... 

1     3   Assigned   ... 
2     3   Interviewed  ... 
3     3   Offer Accepted ... 
4     3   Hired   ... 
5     3   Bench   ... 

Я хочу отбора кандидатов, который имеет последний статус «Предложение принято» и никогда раньше не было «Нанято». В моем примере должен быть выбран только 1-й пользователь, потому что второй уже нанятый и третий был нанят раньше (и фактически на скамейке).

UPD: Я подготовил SQL заявление, которое должно фильтровать пользователей, но не уверен, что его скорость, количество пользователей может быть довольно большой:

SELECT * FROM dbo.CandidatePositionStatus 
WHERE CandidateId=34841 
AND 'Hired' NOT IN (SELECT Status FROM dbo.CandidatePositionStatus WHERE CandidateId=34841) 

Но я не знаю, как вставлять его в другой выберите для предоставления CandidateId

UPD2: Я подготовил еще один запрос, но он просто проверяет, имеет ли кандидат статус ОА и не имеет статуса «HR», но скорость запроса по-прежнему остается открытым.

SELECT DISTINCT CandidateId 
FROM dbo.CandidatePositionStatus 
WHERE 
    CandidateId IN (
     SELECT CandidateId FROM dbo.CandidatePositionStatus WHERE PositionStatusForCandidateCode='Offer Accepted' AND FirstWorkingDay IS NOT NULL 
    ) 
    AND CandidateId NOT IN (
     SELECT CandidateId FROM dbo.CandidatePositionStatus WHERE PositionStatusForCandidateCode='Gired' 
    ) 
+0

Что делать, если кандидат id 1 имеет еще одну запись скамьи после принятия Предложения. – TechDo

+0

Это логически невозможно, так что это не так. В логике не удастся с вашими условиями, это нормально. –

+0

@ AlexG.P. В вашем случае выход должен возвращать идентификатор кандидата 1, где он получил предложение, но не нанял право? –

ответ

0

Проверьте, достаточно ли следующего запроса. Я опустил случай Hire, так как базовая проверка для последнего значения Offer Accepted.

select 
    CandidateId 
From(
    select 
     *, 
     MAX(CandidateStatusId) over(partition by CandidateId) MaxVal 
    From 
     CandidatePositionStatus 
)x 
where MaxVal=CandidateStatusId and [Status]='Offer Accepted' 
+0

Благодарим за решение. Он работает как ожидается после небольшой регулировки. –

0

Основываясь на ваших требованиях, я написал это.

Не проверено.

select CandidateId 
from dbo.CandidatePositionStatus 
group by CandidateId 
having sum(case when PositionStatusForCandidateCode = 'Offer Accepted' then 1 else 0 end) = 1 
and sum(case when PositionStatusForCandidateCode = 'Hired' then 1 else 0 end) = 0; 
+0

Не работает, если какая-либо другая строка для CandidateId существует с другим статусом. Ваш запрос возвращает его, но не должен. Есть несколько статусов, которые не могут появиться после принятия Предложения (например, Bench). Но есть пара статусов wgich. –

Смежные вопросы