2016-12-23 3 views
3

I mit 3 Spalten einer Tabelle haben,SQL - 3 Spaltenfilter

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 

Ich brauche alle Zeilen, die die Primary Site haben - A
Ich brauche auch Zeilen mit derselben ID und demselben Datum der Seite kann anders sein.
Wenn Zeilen die gleiche ID aber ein anderes Datum haben, dann müssen sie herausgefiltert werden. So sollte die Tabelle aussehen -

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 

Antwort

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 

Erläuterung:

Die Unterabfrage identifiziert ID, Date Paare, für die mehr als einen Datensatz diese Werte (ohne Berücksichtigung der Website) erscheinen müssen. Der Join markiert diese Datensätze, die Sie beibehalten möchten. In der WHERE-Klausel werden doppelte Datensätze oder Datensätze mit der 'A'-Site in der Ergebnismenge beibehalten.

+0

Perfect, danke – 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

, wenn Ihr SQL Server 2012 ist die Version (oder besser) können Sie hinken verwenden

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