2016-04-08 2 views
0

以下のフォーマットを持ち、結果が期待通りの単一テーブルをクエリする必要があります。 IDのステータス検証および登録が同じ日にあるので、それは無視され、他の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

これにはかなりの変数があることがわかりましたので、私の答えは削除されました。私はHeinziが正しいと思う、我々はパラメータを提供するために、より多くのサンプルデータが必要である。 IDに一致するものがないことを推測することはできますか?登録済みのステータスを確認したいのですが、確認済みではありませんか? –

答えて

0

うーんを返却する必要があります。 1つの方法はウィンドウ関数を使用します。

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; 

これは、各日付で1つのステータスしか持たないレコードを返します。ここで

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 

たくさんAPH 1

関連する問題