问题描述
嗨,汤姆,
假设我有这样的表,
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账户) 和他们的开户日期,那里的规则已经被打破。
假设我有这样的表,
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




