2016-04-08 6 views
0

Мне нужен запрос для отдельной таблицы, которая имеет следующий формат и ожидает результата. Поскольку статус для удостоверения личности проверена и зарегистрирована в на тот же день, что следует игнорировать и другой ID должен быть возвращенSQL-запрос из одной таблицы

Таблица 1

ID Status Date 
123 Validated 2/3/2016 
123 Registered 2/3/2016 
234 Validated 2/5/2016 
234 Registered 2/7/2016 
345 Validated 2/6/2016 
456 Registered 2/9/2016 

Результат

ID Status Date 
234 Registered 2/7/2016 
456 Registered 2/9/2016 
+4

Просьба указать * * точный алгоритм вы будете использовать, чтобы добраться до результата (то есть, если вы пишете инструкции для кого-то делать это на руку, как они выглядят?) – Heinzi

+0

Эх удалил мой ответ, как я вижу сейчас, что есть немало переменных. Я думаю, что Хейнзи правильный, нам нужны дополнительные данные для предоставления параметров. Можем ли мы сделать вывод о том, что в ID нет совпадений, чем вы хотите видеть статус зарегистрированных, но не проверенных? –

ответ

0

Хммм. Один из методов использует функции окна:

select t.* 
from (select t.*, min(status) over (partition by id, date) as mins, 
      max(status) over (partition by id, date) as maxs 
     from t 
    ) t 
where mins = maxs; 

Это возвращает записи, имеющие только один статус для каждой даты.

2

Вот вариант использовать соединение (с некоторыми образцами данных для тестирования):

create table #table1 (id int, stat varchar(20), dt date) 

insert into #table1 values(123 ,'Validated', '2/3/2016') 
insert into #table1 values(123 ,'Registered', '2/3/2016') 
insert into #table1 values(234 ,'Validated', '2/5/2016') 
insert into #table1 values(234 ,'Registered', '2/7/2016') 
insert into #table1 values(345 ,'Validated', '2/6/2016') 
insert into #table1 values(456 ,'Registered', '2/9/2016') 

Select a.* 
from #table1 a 
left join #table1 b 
on a.id = b.id 
    and a.dt = b.dt 
    and b.stat <> 'Registered' 
where a.stat = 'Registered' and b.stat is null 
0

Другой метод подзаконным запроса, как;

select t.* 
from tbl t 
where Status = 'Registered' 
and Date not in (
    select date from tbl 
    where Status = 'Validated' 
) 
0
SELECT * 
FROM table 
WHERE [Status] = 'Registered' 
    AND ID NOT IN (SELECT ID FROM table GROUP BY ID, [Date] HAVING COUNT(ID) > 1) 
0
Select r.* 
from table1 r 
left join table1 v 
     on v.id = r.id 
    and v.[date] = r.[date] 
    and v.stat ='Validated' 
where r.stat = 'Registered' 
and v.id is null 

много же, как ПВД +1