[英]Oracle:Compare multiple rows in same table on date
我试图根据以下条件获得结果。 我的表有以下列 id、updateFlag、updateTime。 标准,如果多个updateDates相同,则获取 id 1 且 updateFlag ='Y' 否则获取最新的updateTime id 。
这是我的 SQL 脚本;
updateFlag 可能的值 'Y','N',null
create table customer(id varchar2(20),updateFlag char(1),updateTime DATE);
insert into customer(id,updateFlag,updateTime) values(1,'N',to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
insert into customer(id,updateFlag,updateTime) values(2,'N',to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
insert into customer(id,updateFlag,updateTime) values(3,'Y',to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
commit;
当我使用以下查询时,它工作正常,因为标志之一是“Y”;
select * from customer where id in(1,2,3) and updateFlag='Y' order by updateTime;
但是当我为 updateFlags 插入以下混合了 null 和 'N' 的脚本时,我希望得到 'N'。
insert into customer(id,updateFlag,updateTime) values(1,'N',to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
insert into customer(id,updateFlag,updateTime) values(2,'N',to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
insert into customer(id,updateFlag,updateTime) values(3,null,to_date('16-JAN-20 04.54.37','DD-MON-RR HH.MI.SS'));
如果最近的 updateTime 不等于其他行,则还有一个条件获取最近的 ID。
感谢帮助。
很抱歉在这里重新表述这个问题造成混淆。
您可以使用如下analytical function
:
Select * from
(select c.*,
row_number() over (order by updatetime desc, updateflag desc nulls last) as rn
from customer c
where id in (1, 2, 3))
Where rn = 1
干杯!!
如果我理解正确,你想要一行。 这对它们进行排序,因此您想要的是第一个:
select *
from customer c
where id in (1, 2, 3)
order by (case when updateFlag = 'Y' then 1 else 2 end), -- put those first
updateTime;
然后使用fetch first 1 row only
在 Oracle 12C+ 中fetch first 1 row only
或在外部查询中使用rownum = 1
的子查询来仅获取一行。
如果没有您希望从查询中获得的示例数据,很难理解您想要什么。 但是,如果您只想从您提供给我们的第一组数据中获取一行,而从您提供给我们的另一组数据中再获取一行,那么这将是您需要的查询。
首先,我需要说的是,我假设您对提供给我们的数据有误。 第二组中的 updateDates 应该与第一组不同吗? 也许我错了...
这是演示
select * from customer
where (updateTime, id) in (
select updateTime, max(case when updateFlag = 'Y' then id
else (select max(id) from customer c where c.id = c1.id)
end)
from customer c1
group by updateTime);
或者,如果您想要最小 ID,则:
select * from customer
where (updateTime, id) in (
select updateTime, min(case when updateFlag = 'Y' then id
else (select min(id) from customer c where c.id = c1.id)
end)
from customer c1
group by updateTime);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.