2017-10-11 8 views
1

をフィルタリングし、重複するコードを選択するには:私は別の数ヶ月内にある重複したコードが含まれている名前を選択する必要がSQLは、次の表を持つ日付で

id name     code     date 
------------------------------------------------------------------- 
1 name1     c01      10/01/2017 
2 name1     c02      10/05/2017 
3 name2     c01      02/04/2017 
4 name2     c02      02/07/2017 
5 name2     c03      02/15/2017 
6 name2     c02      02/20/2017 
7 name2     c04      03/01/2017 
8 name3     c01      04/18/2017 
9 name3     c02      04/29/2017 
10 name3     c01      05/03/2017 

。 Name1には重複コードは含まれていませんが、Name2には重複コードc02が含まれていますが、両方のコードが2月にあるため表示されませんがName3には4月と5月が異なる重複コードc01が含まれています。私は重複したコードを持っている名前を取得するには、次の選択を使用しますが、彼らは異なるヶ月であるかどうかを検証する方法がわからないのです

name     
----- 
name3 

select name, code, count(*) from table having count(*)>1 

答えて

1

うーん。 。 。

select distinct name 
from t 
group by name, code 
having year(min(date)) <> year(max(date)) or 
     month(min(date)) <> month(max(date)); 

これはselect distinctを使用してgroup byで理にかなって非常に、非常にいくつかの例です。 codeも同様にしたい場合は、select name, codeとすることができます。

having datediff(month, min(date), max(date)) <> 0 

これは正式に別のカレンダーの月である任意の行を除外します:

また、havingに変更することができます。経験不足の人は、2017-01-31と2017-02-01が1か月間ではないと考えて混乱するかもしれません(datediff()による)。

1

これは、各コードの各名前を月ごとに結果をグループ化して、同じ月に同じコードに対して何人の名前が繰り返されるかを調べることができます。 1ヶ月に1つのコードを持つコードのみ

SELECT name, code, month(your_date), count(*) 
    FROM yourtable y, 
     (SELECT name, code,count(*) 
     FROM yourtable 
     GROUP BY NAME, CODE 
     HAVING count(*) >2) x 
WHERE x.name = y.name and x.code = y.code 
GROUP BY name, code 
HAVING count(*) = 1