2017-10-11 64 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,但兩個代碼都在二月,所以它不應該出現,但Name3包含重複的代碼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可改爲:

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

這將正式篩選出在不同的日曆月份的所有行。經驗較少的人可能會感到困惑,認爲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