2

这是我所拥有的查询的更简单版本。

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 还是比较陌生,想知道是否有更好的方法来解决这个问题。

4

2 回答 2

3
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 为当天某个时间的行。

于 2012-06-25T20:22:05.533 回答
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 join
     Alias2
     on Alias1.file_tag = Alias2.file_tag and
        Alias1.ID < Alias2.ID
order by Alias1.creation_dt desc 

用小于命令替换不等于这两个想法,因此较小的总是第一个。这将消除重复。注意:我还修复了连接语法。

于 2012-06-25T22:00:40.337 回答