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
收集开始日期和结束日期之间 person
和 type
的每个组合(请将 startDate
和 endDate
替换为你正在引用那些)并计算它们。
外部 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
将自动使用列 person
和 type
。
我有 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
收集开始日期和结束日期之间 person
和 type
的每个组合(请将 startDate
和 endDate
替换为你正在引用那些)并计算它们。
外部 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
将自动使用列 person
和 type
。