2017-02-20 12 views
0

У меня есть таблица со следующими столбцами и данными, и я пытаюсь написать запрос, чтобы он отображался только тогда, когда пользователь не вошел в систему :Как отображать только пользователей, которые не могут войти в систему и исключить остальные в SQL

SELECT 'Seth' as First_name, 'Rollins' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all 
SELECT 'Seth' as First_name, 'Rollins' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all 
SELECT 'Seth' as First_name, 'Rollins' as Last_Name, getdate() as timestamp, 'password reset' as verb 
union all 
SELECT 'Seth' as First_name, 'Rollins' as Last_Name, getdate() as timestamp, 'logged in' as verb 
union all 
SELECT 'Kevin' as First_name, 'Owens' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all 
SELECT 'Kevin' as First_name, 'Owens' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all 
SELECT 'Kevin' as First_name, 'Owens' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all     
SELECT 'Kevin' as First_name, 'Owens' as Last_Name, getdate() as timestamp, 'password reset' as verb 
union all     
SELECT 'Kevin' as First_name, 'Owens' as Last_Name, getdate() as timestamp, 'logged in' as verb 
union all 
SELECT 'Kevin' as First_name, 'Owens' as Last_Name, getdate() as timestamp, 'logged in' as verb 
union all 
SELECT 'Roman' as First_name, 'Reigns' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all     
SELECT 'Roman' as First_name, 'Reigns' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all     
SELECT 'Roman' as First_name, 'Reigns' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all 
SELECT 'Roman' as First_name, 'Reigns' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all     
SELECT 'Roman' as First_name, 'Reigns' as Last_Name, getdate() as timestamp, 'password reset' as verb 
union all 
SELECT 'Roman' as First_name, 'Reigns' as Last_Name, getdate() as timestamp, 'password reset' as verb 
union all 
SELECT 'Seth' as First_name, 'Rollins' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all 
SELECT 'Seth' as First_name, 'Rollins' as Last_Name, getdate() as timestamp, 'tried log in' as verb 
union all 
SELECT 'Seth' as First_name, 'Rollins' as Last_Name, getdate() as timestamp, 'password reset' as verb 
union all 
SELECT 'Seth' as First_name, 'Rollins' as Last_Name, getdate() as timestamp, 'tried log in' as verb 

Это дает мне следующий вывод:

First_name Last_Name timestamp    verb 
Seth  Rollins 2017-02-20 15:28:55.660 tried log in 
Seth  Rollins 2017-02-20 15:28:55.660 tried log in 
Seth  Rollins 2017-02-20 15:28:55.660 password reset 
Seth  Rollins 2017-02-20 15:28:55.660 logged in 
Kevin  Owens 2017-02-19 15:28:55.660 tried log in 
Kevin  Owens 2017-02-19 15:28:55.660 tried log in 
Kevin  Owens 2017-02-19 15:28:55.660 tried log in 
Kevin  Owens 2017-02-20 15:28:55.660 password reset 
Kevin  Owens 2017-02-20 15:28:55.660 logged in 
Kevin  Owens 2017-02-21 15:28:55.660 logged in 
Roman  Reigns 2017-02-20 15:28:55.660 tried log in 
Roman  Reigns 2017-02-20 15:28:55.660 tried log in 
Roman  Reigns 2017-02-20 15:28:55.660 tried log in 
Roman  Reigns 2017-02-20 15:28:55.660 tried log in 
Roman  Reigns 2017-02-20 15:28:55.660 password reset 
Roman  Reigns 2017-02-20 15:28:55.660 password reset 
Seth  Rollins 2017-02-21 15:28:55.660 tried log in 
Seth  Rollins 2017-02-21 15:28:55.660 tried log in 
Seth  Rollins 2017-02-21 15:28:55.660 tried log in 

в настоящее время я пытаюсь написать запрос так, он отображает только отсчеты Роман Рейнс, как он не вошел в успешно, так это будет показывать количество попыток входа в систему, а также сброс пароля. Первый набор результатов для Seth Rollins не должен отображаться, но те из 21-02-2017 должны отображаться, так как он не успешно вошел в систему.

В настоящее время я пытаюсь найти лучший способ написать этот запрос.

Мой ожидаемый результат будет следующим:

First_Name, Last_Name, Count of TriedLogIn, Count of PasswordResets 
Roman  Reigns   4      2 
Seth   Rollins   3      null 

Причина, почему появилось имя Сет Роллинз, потому что после успешного входа в систему на 20/02 он не имел успешного входа в систему после этой даты (21/02). После успешного входа в счетчик затем сбрасывается обратно в 0.

ответ

0

Использовать not exists

select * 
from users u1 
where verb = 'tried log in' 
and not exists 
(
select 1 
from users u2 
where u1.firstname = u2.firstname 
and u1.lastname = u2.lastname 
and u2.verb = 'logged in' 
) 
+0

Добавьте в свою дату, и я думаю, вам хорошо идти. – Jens

+0

Спасибо за ответ, но этот запрос не сработает, как ожидалось. Я включил ожидаемый результат в вопрос. – VGJ

1

Для этого конкретного пользователя, используйте case выражения, чтобы сделать условный подсчет:

select count(case when verb = 'tried log in' then 1 end) as loginfailures, 
     count(case when verb = 'password reset' then 1 end) as passwordresets 
from tablename 
where First_name = 'Roman' and Last_name = 'Reigns' 

Если вы хотите такая же информация, но для всех пользователей, сделайте GROUP BY:

select First_name, Last_name, 
     count(case when verb = 'tried log in' then 1 end) as loginfailures, 
     count(case when verb = 'password reset' then 1 end) as passwordresets 
from tablename 
group by First_name, Last_name 
+0

Спасибо за ответ, но я думаю, что этот запрос не сработает, поскольку Сет Роллинз смог войти в первый раз после сброса пароля, но через день столкнулся с трудностями. В коде, о котором вы упоминали, это означало бы, что оба опробованных входа и пароля с 20.02.2017 также будут считаться частью подсчета. Надеюсь, что имеет смысл. – VGJ

+0

@VGJ, можете ли вы отредактировать свой вопрос и добавить ожидаемый результат (как форматированный текст)? – jarlh

+0

Я отредактировал вопрос @jarlh – VGJ