Oracle中要查询出连续出现3天的数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中要查询出连续出现3天的数据相关的知识,希望对你有一定的参考价值。
就比如说第一条数据在6号,7号,8号几天里,每次都出现了就要把这条数据在界面上显示出来
参考技术A select * from cjgl_cjqxx where cjd in(
select cjd from
(
select cjd from cjgl_cjqxx where cbrq = to_date('2014-05-06','yyyy-mm-dd') group by cjd
union
select cjd from cjgl_cjqxx where cbrq = to_date('2014-05-07','yyyy-mm-dd') group by cjd
union
select cjd from cjgl_cjqxx where cbrq = to_date('2014-05-08','yyyy-mm-dd') group by cjd
)
group by cjd having count(cjd) = 3;
) ;
试试看。追问
兄台 谢谢 ! 但是不行啊 你这样写不是写死了吗 这是指定了日期啊
追答select * from cjgl_cjqxx where cjd in
(
select cjd from
(
select cjd from cjgl_cjqxx where cbrq = to_date('参数yyyy-mm-dd','yyyy-mm-dd') group by cjd
union
select cjd from cjgl_cjqxx where cbrq = to_date('参数yyyy-mm-dd','yyyy-mm-dd')+1 group by cjd
union
select cjd from cjgl_cjqxx where cbrq = toto_date('参数yyyy-mm-dd','yyyy-mm-dd')+2 roup by cjd
)
group by cjd having count(cjd) = 3;
) ;
参数是yyyy-mm-dd格式的日期字符串,代表你需要的三天中的第一天
兄台 ! 不是的 题目的意思是只需要有连续三天的就输出 不是要具体某天连续的三 不需要指定的
追答cbrq字段不是记录输出的时间吗,我给的SQL中会随着你给的参数递增到第三天。请注意第二个union时间条件+1,第三个union的时间条件+2。
oracle求查询连续三天的数据
select ids,reptype,YESTERDAYWORKINGTIME,WORKDATE from TMS_YJ_DayH
求reptype别WORKDATE连续三天,YESTERDAYWORKINGTIME>2的数据,例如:DX150LC-CH10,11月14,11月15,11月16,YESTERDAYWORKINGTIME都大于2,那么就显示连续三天中WORKDATE最大的一条数据,明细显示3条;连续4天的话,显示连续4天中WORKDATE最大的一条数据,明细显示最大的3条;连续天数<3的数据不显示
假如:11月11,11月12,11月13,11月20,11月21,11月22都超了2小时如果查询条件是11月10到11月15日那么主表显示11月13,子表显示11月11,11月12,11月13,如果查询条件是11月10到11月30日那么主表显示11月22,子表显示11月20,11月21,11月22
思路这样,查询所有reptype最大的那三条WORKDATE信息,并且YESTERDAYWORKINGTIME>2,然后将这三条数据中max(WORKDATE)-MIN(WORKDATE)=2的reptype的数据打印出来。
需要嵌套查询。
如果是连续三天的数据中最大的那三条思路要变一下。追问
假如:11月11,11月12,11月13,11月20,11月21,11月22都超了2小时
如果查询条件是11月10到11月15日那么主表显示11月13,子表显示11月11,11月12,11月13,如果查询条件是11月10到11月30日那么主表显示11月22,子表显示11月20,11月21,11月22
OK,要是取主表和子表,可以把下面的SQL改一下就可以了,假设表名为WKTIME:
Select b.reptype, b.workdate,b.* From (Select d.* ,rownum rn From (Select * From wktime where YESTERDAYWORKINGTIME >= 2 order by reptype, workdate desc) d) b, (Select z.reptype,max(z.tpdate) tpdate from (Select distinct a.reptype, a.workdate + rownum tpdate From (Select * From wktime where YESTERDAYWORKINGTIME >= 2 order by reptype, workdate desc) a group by a.reptype, a.workdate + rownum having count(a.workdate + rownum) >= 3) z group by z.reptype )c where b.workdate + b.rn = c.tpdate
and b.reptype = c.reptype;
基本的原理就是把所有YESTERDAYWORKINGTIME >2的数据查询出来,然后按照日期从大到小排一个序,排序完成之后我们使用workdate + rownum进行一下分组,如果按照reptype,workdate + rownum这两列的分组中,count值大于3的,就说明这三天的数据是连续的。
找出连续的三天之后就好处理了,想要那个数据就用这个结果和原来的表进行条件运算就可以了。
workdate + rownum的意义是什么,我这里不太明白
追答数据被逆序排序之后,会从大到小的排列,ROWNUM是排序的行号。举例如下:
workdate rownum +之后结果
2013/12/26 3 2013/12/292013/12/27 2 2013/12/292013/12/28 1 2013/12/292013/12/20 11 2013/12/312013/12/21 10 2013/12/312013/12/22 9 2013/12/31
如果是连续的那么workdate + rownum的值是相同的,如果workdate + rownum相同的值出现了三次,说明有三天是连续的,如果出现了多次,就说明多天连续。
reptype需要一致,分上下两个表上面显示连续三天最大的一条,下面显示具体的三条信息
以上是关于Oracle中要查询出连续出现3天的数据的主要内容,如果未能解决你的问题,请参考以下文章