这是我的查询的一个简单版本。
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/