这是我查询的简单版本。
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的新手,并想知道是否有更好的方法来解决这个问题。
答案 0 :(得分: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;
这可以让你获得今天至少有2条记录的每个file_tag中的第一行(最早)行。
内部选择按创建日期计算每组相同file_tag记录的相对行数。外部选择检索每个分区中的第一个。
这从您的目标声明中假定您希望对每个file_tag的最早单行执行某些操作。内部查询仅返回当天某个时间的creation_date的行。
答案 1 :(得分: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
用两个以下的概念替换not-equals,因此较小的一个总是第一个。这将消除重复。注意:我还修复了连接语法。