新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
创建测试表:
丰宁ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
create table test
(name varchar2(1),
num int);
insert into test values ('A',1);
insert into test values ('A',2);
insert into test values ('A',4);
insert into test values ('B',5);
insert into test values ('B',7);
insert into test values ('B',8);
insert into test values ('C',9);
insert into test values ('C',11);
commit;
执行:
with t as
(select name,
num,
row_number() over(partition by name order by num desc) rn
from test)
select s.name, s.num
from (select t2.*
from t t1, t t2
where t1.rn = t2.rn - 1
and t1.num = t2.num + 1
and t1.rn = 1
union all
select * from t where rn = 1) s
order by name, num
结果:
!@#$%^QWERTY!@#$%是我认为在你表中绝不可能出现的字符串,如果你觉得不够保险,可以随意替换成你认为的绝对不可能出现的字符串。
如果觉得帮助,请采纳:)
SQL select * from test;
ID
------------------------------
111111111111
2222222
33333333
4444444
555555556666
7888888888
8888888889
00000000000
1111 1111
222 3333
abc
aaa
AAAA
ABCD
a111111
222221a
16 rows selected
SQL select id from test where REGEXP_REPLACE (id,'(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)','!@#$%^QWERTY!@#$%')='!@#$%^QWERTY!@#$%';
ID
------------------------------
111111111111
2222222
33333333
4444444
00000000000
SQL
我的大概想法和思路(本人无环境,所有内容都是臆想出来的,没办法测试)
(1)分组,因为是只要连续7天内5天即可,每天的次数并不重要,所以按照(人名和日期(不是时间是日期也就是截取到日)分组),这样可以去掉每天重复的次数。
(2)分好组后的内容,按照人名和日期排序。这样也就是说所有张三的都在一起,李四的都在一起,而且每个人的都是按照日期排序的。(这步其实不做也可以,因为下面的lead函数本身也可以分组排序,不过这样说对你来说更直观一些)
(3)利用lead函数(就是查某行数据的下几行的函数,可能你没有用过,我用的次数也不多。)往下查4行。
这个就是出现了5次,因为:四行+本身=5次,只要证明这5次发生在7天内就可以了。
(4)所以最后一步就是利用lead的列-原来的时间列小于等于6就可以了,只要小于等于6,那么就符合条件(因为相减为7那么是8天,所以要相减为6),就输出。
我按照你给的数据,大概写一个,不一定能用(什么转换之类的我都没写,所以基本肯定不能直接用),不过意思你大概应该能明白。
seelct * from
(select a.人名,a.日期,lead(a.日期,4,null)over(partition by 人名 order by q.日期) 五次后的日期 from
(select 人名,trunc(时间,'dd')日期 from table geoup by 人名,trunc(时间,'dd')) a
) b where b. 五次后的日期-b.日期=6
大概就是这么个意思。
第二步select查出来的内容,应该类似
张三 2001-10-1 2001-10-7
张三 2001-10-2 null(按照现有的数据来说就是null,这样就不能说是出现了5天了)
同样下面的张三也都是null
李四 2001-10-4 2001-10-10
李四 2001-10-6 2001-10-11
李四 2001-10-8 2001-10-12
问一下:是要找连续三天最大的,还是最大的数据是连续三天的?如果是最大的数据连续三天的
思路这样,查询所有reptype最大的那三条WORKDATE信息,并且YESTERDAYWORKINGTIME2,然后将这三条数据中max(WORKDATE)-MIN(WORKDATE)=2的reptype的数据打印出来。
需要嵌套查询。
如果是连续三天的数据中最大的那三条思路要变一下。
create table test
(bh varchar2(10),
k_date int,
qualified varchar2(10));
insert into test values ('张三',2017,'不合格');
insert into test values ('张三',2016,'不合格');
insert into test values ('张三',2015,'合格');
insert into test values ('张三',2012,'合格');
insert into test values ('李四',2017,'合格');
insert into test values ('李四',2015,'不合格');
insert into test values ('李四',2012,'合格');
insert into test values ('王五',2017,'合格');
insert into test values ('王五',2016,'不合格');
insert into test values ('王五',2013,'不合格');
commit;
执行:
with t as
(select * from test where qualified='不合格')
select t2.* from t t1 left join t t2 on t1.bh=t2.bh and t1.k_date=t2.k_date-1 where t2.bh is not null
union
select t2.* from t t1 left join t t2 on t1.bh=t2.bh and t1.k_date=t2.k_date+1 where t2.bh is not null
结果: