2017-10-11 3 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이 한 달이 따로 따로 있지 않다는 생각을하면 혼란 스러울 수 있습니다. datediff()에 따르면

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