2016-12-23 36 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]