繁体   English   中英

Oracle:比较同一表中的多行日期

[英]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。

在此处输入图片说明

感谢帮助。

很抱歉在这里重新表述这个问题造成混淆。

  1. 根据最近更新的时间获取 id。
  2. 如果有两个或更多最近的 updatedTime 具有相同的值,则获取具有 updatedFlag='Y' 的 id
  3. 如果有两个或更多最近更新的时间具有相同的值,但没有一个标志为“Y”,则获取带有“N”的值。

您可以使用如下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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM