2016-12-23 11 views
3

私は3列、SQL - 3列フィルタ

ID ---- Site ---- Date 
1A ----- A ----10/12/16 
1A ----- B ----11/12/16 
2A ----- A ----10/12/16 
3A ----- A ----09/12/16 
3A ----- B ----09/12/16 
4A ----- A ----11/12/16 
5A ----- A ----11/12/16 
5A ----- B ----11/12/16 
6A ----- A ----09/12/16 
6A ----- B ----10/12/16 

を持つテーブルを持って、私はプライマリサイトを持っているすべての行必要がある - 私も同じIDと同じ日付を持つ行を必要とする
を、サイト異なることができます。
行のIDが同じでも日付が異なる場合は、それらをフィルタリングする必要があります。 ので、テーブルは以下のようになります -

ID ---- Site ---- Date 
1A ----- A ----10/12/16 
2A ----- A ----10/12/16 
3A ----- A ----09/12/16 
3A ----- B ----09/12/16 
4A ----- A ----11/12/16 
5A ----- A ----11/12/16 
5A ----- B ----11/12/16 
6A ----- A ----09/12/16 

答えて

6
SELECT t1.* 
FROM yourTable t1 
LEFT JOIN 
(
    SELECT ID, Date 
    FROM yourTable 
    GROUP BY ID, Date 
    HAVING COUNT(*) > 1 
) t2 
    ON t1.ID = t2.ID AND 
     t1.Date = t2.Date 
WHERE t1.Site = 'A' OR 
     t2.ID IS NOT NULL 

説明:

サブクエリは複数のレコードが(サイトを無視して)、これらの値を持つ表示されるためIDDateペアを識別します。結合は、保持したいこれらのレコードをマークします。 WHERE句では、重複レコードまたは'A'サイトを持つレコードが結果セットに保持されます。

+0

パーフェクトに遅れます – AMorton1989

1
with tb(ID,Site,[Date]) AS(
    select '1A','A','10/12/16' union all 
    select '1A','B','11/12/16' union all 
    select '2A','A','10/12/16' union all 
    select '3A','A','09/12/16' union all 
    select '3A','B','09/12/16' union all 
    select '4A','A','11/12/16' union all 
    select '5A','A','11/12/16' union all 
    select '5A','B','11/12/16' union all 
    select '6A','A','09/12/16' union all 
    select '6A','B','10/12/16') 
    select * from (
    SELECT *, count(0)OVER (PARTITION BY ID, Date) AS SameDateCount 
    FROM tb 
) as t where t.site='A' OR t.SameDateCount>1 
0
select * from 
    (
    SELECT *, rank() OVER (PARTITION BY ID order by id, Date) AS rnk 
    FROM yourtable 
    ) tmp where rnk=1 
0

お使いのSQL Server 2012のバージョン(またはそれより優れた)である場合には、使用することができますありがとう、

select * from 
    (
    select *, lag([Date]) over(partition by ID order by [Date]) as valbefor 
    from yourtable 
    ) tmp where isnull(valbefor, [Date])=[Date]