sql - 查询调用连接的相同表的两个实例来比较字段,给出镜像结果。如何消除镜像重复项?

标签 sql oracle

这是我的查询的一个简单版本。

Alias1 as 
(select distinct ID, file_tag, status, creation_date from tables where creation_dt >= sysdate and creation_dt <= sysdate + 1),

Alias2 as 
(select distinct ID, file_tag, status, creation_date from same tables creation_dt >= sysdate and creation_dt <= sysdate + 1)

select distinct Alias1.ID ID_1,
           Alias2.ID ID_2,
           Alias1.file_tag,
           Alias1.creation_date in_dt1,
           Alias2.creation_date in_dt2
    from   Alias1, Alias2
    where Alias1.file_tag = Alias2.file_tag
          and Alias1.ID != Alias2.ID
    order by Alias1.creation_dt desc

这是结果的示例。尽管它们的值颠倒了,但它们是相同的。

    ID_1 ID_2  File_Tag     in_dt1          in_dt2
    70   66    Apples       6/25/2012 3:06  6/25/2012 2:53:47 PM
    66   70    Apples       6/25/2012 2:53  6/25/2012 3:06:18 PM

该查询的目标是查找多个具有匹配文件标签的 ID,并对当天早些时候提交的 ID 执行操作(查询每天运行,只需要当天的重复项)。我对 SQL/Oracle 还比较陌生,想知道是否有更好的方法来解决这个问题。

最佳答案

SELECT *
  FROM (SELECT id, file_tag, creation_date in_dt
             , row_number() OVER (PARTITION BY file_tag 
                                      ORDER BY creation_date) rn
             , count(*) OVER (PARTITION BY file_tag) ct
          FROM tables
         WHERE creation_date >= TRUNC(SYSDATE)) tbls
 WHERE rn = 1
   AND ct > 1;

这应该会让您在每个 file_tag 中的第一行(最早的行)今天至少有 2 条记录。

内部选择按创建日期计算每组相同 file_tag 记录的相对行号。外部选择检索每个分区中的第一个。

这从您的目标声明中假设您希望对每个 file_tag 的最早的单行执行某些操作。内部查询仅返回creation_date为当天某个时间的行。

关于sql - 查询调用连接的相同表的两个实例来比较字段,给出镜像结果。如何消除镜像重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11196608/

相关文章:

php - 如何在 Azure 上运行的服务器上安装 MySQL PHP 驱动程序?

database - Oracle 表空间分配/使用性能影响

oracle - 将 "expected"Oracle 异常返回到 Java Groovy/Grails 的最佳方法

sql - 列 SQL 的多数表决

c# - 与 Oracle 的连接通过控制台应用程序工作,而不通过 Web 服务工作

sql - 从球员列表开始生成比赛列表

sql - 关系代数 - 自然连接 - 一些基础知识

mysql查询当外键关系时用单个查询删除多个表

mysql - 获取每个项目每年相似项目的数量

SQL服务器: Check if variable is null and then assign statement for Where Clause