2017-04-04 58 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