暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 查询查找数字和日期之间的缺失序列

askTom 2017-05-25
258

问题描述

嗨,汤姆,

假设我有这样的表,

Acc_number Opening_date (MM/DD/YYYY)
123 01-2015
125 01-02-2016
126 01-04-2016
128 01-2014 (打破规则)
129 01-07-2016

这里的账号是用一个开业日期生成的。规则是,当您开户时,账号和开户日期应该大于之前的账号和日期。但是顺序已经打破了一些方式。所以我需要一个sql查询,找到违反规则的帐号和日期。

这里,对于账号128的开户日期应该大于之前的开户日期。我在表格里有几千个账号。所以我需要找到那些账户 (128账户) 和他们的开户日期,那里的规则已经被打破。

专家解答

您可以使用lag在结果集中向后看。获取以前的日期,按id排序。如果这大于当前日期,那么你知道他们是无序的:

with rws as (
  select 1 id, date'2015-01-01' dt from dual union all 
  select 2 id, date'2017-01-01' dt from dual union all 
  select 3 id, date'2016-01-01' dt from dual union all 
  select 4 id, date'2018-01-01' dt from dual 
), prev as (
  select r.*, lag(dt) over (order by id) prev_dt
  from   rws r
)
  select * from prev
  where  dt < prev_dt;

ID  DT                    PREV_DT               
3   01-JAN-2016 00:00:00  01-JAN-2017 00:00:00  


也就是说,有一个规则说 “帐号和开户日期必须都按相同的顺序” 是一个糟糕的主意。很难以可扩展的方式正确执行此操作。而且,正如你所发现的,很容易打破...
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论