2017-04-04 60 views
0

我有表,我想查找特定時間間隔(DATE是SQL查詢的輸入參數)的重複行,它將列出具有相同PERSON和TYPE值的所有行。SQL SELECT從表中重複特定時間間隔的行

ID DATE   PERSON TYPE 
1 01.01.2017 PERSON1 TYPE1 
2 02.02.2017 PERSON1 TYPE1 
3 03.03.2017 PERSON2 TYPE1 
4 04.04.2017 PERSON2 TYPE2 
5 05.05.2017 PERSON2 TYPE1 
6 06.06.2017 PERSON1 TYPE2 

因此,舉例來說,如果日期是01.01 and 04.04之間應列出我行與ID 1 and 2.

如果DATE 01.01 and 06.06之間應列出我行與ID 1, 2, 3and 5,因爲1和2有相同的人並鍵入間隔和3和5在該間隔中具有相同的人和類型。

SELECT ID FROM TABLE 
WHERE DATE>='01.01.2017' AND DATE<='06.06.2017' 

但我不確定如何開始基於PERSON和TYPE列定義此重複子句。 也許可以INNER JOIN幫助這個,如果引用同一個表並且匹配那兩列和第三列ID是不同的?:TABLE.PERSON=TABLE.PERSON and TABLE.TYPE=TABLE.TYPE and TABLE.ID!=TABLE.ID當然表是相同的,但是可以使用不同的別名?

+0

我已經更新了我的答案。 – toonice

回答

1

請嘗試...

SELECT ID AS ID 
FROM tableName 
JOIN 
(
    SELECT person AS person, 
      type AS type, 
      COUNT(person) AS countOfPair 
    FROM tableName 
    WHERE date BETWEEN startDate AND endDate 
    GROUP BY person, 
      type 
) tempTable ON tableName.person = tempTable.person AND 
       tableName.type = tempTable.type 
WHERE countOfPair >= 2 

SELECT收集的person,在你開始和結束日期之間type每個組合(請但是你引用這些替代startDateendDate),並進行計數其中。

SELECT聲明的JOIN然後會將每個組合的計數附加到包含該組合的每一行的末尾。外部SELECT然後從具有重複組合的每一行檢索ID

如果您有任何問題或意見,請隨時發佈相應評論。

+0

謝謝我將此標記爲答案 – Dejan

+0

不客氣。很高興我能幫上忙。 – toonice

-2

添加「DISTINCT」條款,以避免冗餘

SELECT DISTINCT ID FROM TABLE 
WHERE DATE>='01.01.2017' AND DATE<='06.06.2017' 
+0

這將返回該範圍內的每個「ID」中的一個。它不會告訴tehm哪些行重複'Person'&'Type'組合。 – toonice

0

你可以試試這個(我不知道,如果你的版本有窗解析函數): (X爲你的表的名稱)

SELECT Y.ID, Y.DATE, Y.PERSON, Y.TYPE 
FROM (
    SELECT *, COUNT(*) OVER (PARTITION BY PERSON, TYPE) AS RC 
    FROM X 
    WHERE DATE >='01.01.2017' AND DATE <='04.04.2017' 
    ) Y 
WHERE RC>1 

還是這個,如果它不支持:

SELECT X.ID, X.DATE, X.PERSON, X.TYPE 
FROM X 
INNER JOIN (
    SELECT PERSON, TYPE, COUNT(*) AS RC 
    FROM X 
    WHERE DATE >='01.01.2017' AND DATE <='04.04.2017' 
    GROUP BY PERSON, TYPE 
    ) Y ON X.PERSON = Y.PERSON AND X.TYPE = Y.TYPE 
WHERE RC>1 

我建議總是使用日期數據類型的適當轉換。

0

另一種方法是:

SELECT a.id 
FROM tablename a NATURAL JOIN 
    (SELECT person,type FROM tablename 
    WHERE date>='01.01.2017' AND date<='06.06.2017' 
    GROUP BY person, type HAVING COUNT(*)>1) b ; 

NATURAL JOIN會自動使用列persontype