sql - 表格清理,查找时间范围内重复的帖子

标签 sql oracle plsql

我在几个表中有这样的结构:id、[...]、validfrom、validto。

id 是一个 NUMBER,validfromvalidto 列的类型是 DATE。 任何给定日期不应导致每个 id 发布多于一篇帖子。

所以这是一个正确的例子:

id, validfrom, validto
1, 2000-01-01, 2000-02-20
1, 2000-02-21, 2000-03-02
1, 2000-03-03, 2099-12-31

但是,似乎存在一些问题,某些日期会返回多个值。像这样的东西(这是损坏的数据):

id, validfrom, validto
1, 2001-01-01, 2001-02-20
1, 2001-01-15, 2001-03-02
1, 2001-03-03, 2099-12-31

因此,在上面的示例中,2001-01-15 和 2001-02-20 之间的任何日期都将返回两行。

我如何构建一个脚本来查找所有这些损坏的帖子?

最佳答案

只是为了找到它们,假设每一行中的 validfrom 都小于 validto:

select a.*, b.*
from your_table a
join your_table b
on (a.id = b.id and
    --overlapping
    greatest(a.validfrom, b.validfrom) <= least(a.validto, b.validto) and
    --exclude join the same row.
    a.rowid <> b.rowid
    )

这只是找到相交的间隔,因为不同间隔的 valid_from 大于另一个间隔的 valid_to 。

更新:我替换了条件not (a.validto=b.validto and a.validfrom=b.validfrom)

a.rowid<> b.rowid

因为它现在会报告重复的行。 (谢谢沃尔夫)

关于sql - 表格清理,查找时间范围内重复的帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14275074/

相关文章:

sql - 在自定义聚合函数中查找 SUM 和 MAX

sql - Oracle SQL : search column that starts with digits

sql - 如何使用generate_series获取每周间隔内的值的总和

c# - 使用甲骨文数据库。进入以下语句 ."ORA-00936: missing expression",如何解决这个问题?

sql - PL/SQL 存储过程是事务吗?

database - 从 Oracle 11g 中给定的 url 下载文件并将其保存到 blob 类型列中的过程

mysql - 使用 id 对数据进行分组并从第一行和最后一行获取数据

sql - 在SQL SERVER中使用Long和Lat计算点之间的距离

sql - 如何将逗号分隔的值转换为oracle中的行?

oracle - 如何在 Oracle PL/SQL 过程的开始部分之后声明游标