SQL SELECT 在特定时间间隔内重复 table 中的行

SQL SELECT repeating rows from table for specific time interval

我有 table,我想查找特定时间间隔的重复行(DATE 是 SQL 查询的输入参数),它将列出具有相同 PERSON 和 TYPE 值的所有行。

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

因此,例如,如果 DATE 在 01.01 and 04.04 之间,它应该列出带有 ID 1 and 2.

的行

如果 DATE 在 01.01 and 06.06 之间,它应该用 ID 1, 2, 3 and 5 列出我的行,因为 1 和 2 在该间隔内具有相同的人和类型,而 3 和 5 具有相同的人并输入该间隔。

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

但我什至不确定如何开始定义这个基于 PERSON 和 TYPE 列的重复子句。 如果引用相同的 table 并匹配这两列并且第三列 ID 不同,INNER JOIN 也许可以帮助解决这个问题?: TABLE.PERSON=TABLE.PERSON and TABLE.TYPE=TABLE.TYPE and TABLE.ID!=TABLE.ID 当然 table 是相同的,但可以使用不同的别名为此?

添加 "DISTINCT" 子句以避免冗余

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

你可以试试这个(不知道你的版本有没有window解析功能): (X 是您的名字 table)

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

我建议始终对日期数据类型使用适当的转换。

请尝试...

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 收集开始日期和结束日期之间 persontype 的每个组合(请将 startDateendDate 替换为你正在引用那些)并计算它们。

外部 SELECT 语句的 JOIN 然后具有将每个组合的计数附加到包含该组合的每一行的末尾的效果。然后,外部 SELECT 从具有重复组合的每一行中检索 ID

如果您有任何问题或意见,请随时post发表相应的评论。

另一种方法是:

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