Oracle数据库 sql高手请进来:取出某段时间段内,时间中天数连续的数据

表如下:visteridnamevisit_time1张三2001-10-0108:15:202张三2001-10-0208:15:203张三2001-10-0308:1... 表如下:vister
id name visit_time
1 张三 2001-10-01 08:15:20
2 张三 2001-10-02 08:15:20
3 张三 2001-10-03 08:15:20
4 张三 2001-10-07 08:15:20
5 张三 2001-10-08 08:15:20
6 张三 2001-10-11 08:15:20
7 张三 2001-10-12 08:15:20
8 张三 2001-10-13 08:15:20
9 张三 2001-10-14 08:15:20

我要的结果是 在2001-09-15到2001-11-01中张三连续访问最长天数的一组数据,结果如下
id name visit_time
6 张三 2001-10-11 08:15:20
7 张三 2001-10-12 08:15:20
8 张三 2001-10-13 08:15:20
9 张三 2001-10-14 08:15:20

我用的是Oracle数据库
求高手解答,附代码!!!谢谢!!!

查询后结果
2013-8-8 14:10:47
2013-8-8 14:20:47
2013-8-8 14:30:47
2013-8-8 14:40:47
2013-8-8 15:30:47
2013-8-8 15:40:47
2013-8-8 15:50:47
2013-8-8 16:00:47
2013-8-8 16:10:47

sql 查询出来结果,这样就可以了
date1 date2
2013-8-8 14:10:47 2013-8-8 14:40:47
2013-8-8 15:30:47 2013-8-8 16:10:47
把时间连续的分成一组,是Oracle数据库 应该要用row_number() 函数

剩下的我会在后台解决!!
展开
 我来答
ribone
2013-12-12 · 超过32用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:81.6万
展开全部

直接用查询就可以得到你要的结果:

select ID,NAME,VISIT_TIME
   from
      (
      select ID,NAME,VISIT_TIME
            ,CNT
            ,max(CNT) over () MX
         from
            (
            select ID,NAME,VISIT_TIME
                  ,count(MINDATE) over (partition by MINDATE) CNT
               from
                  (
                  select ID,NAME,VISIT_TIME
                        ,MINDATE
                     from 
                        (
                        select ID,NAME,VISIT_TIME
                              ,row_number() over (order by VISIT_TIME) RN
                           from VISTER  t
                           where t.NAME = '张三'
                        ) t
                     model
                     dimension by (t.RN)
                     measures(ID,NAME,VISIT_TIME,trunc(VISIT_TIME) VISIT_DATE,trunc(t.VISIT_TIME) as MINDATE)
                     rules upsert all
                     (
                     MINDATE[any] = 
                        case 
                           when VISIT_DATE[currentv()] - VISIT_DATE[currentv()-1] <= 1 then 
                              MINDATE[currentv()-1] 
                           else 
                              VISIT_DATE[currentv()]
                        end
                     )
                     order by VISIT_TIME
                  )
            )
      )
   where CNT = MX
更多追问追答
追问
你是Oracle数据库的sql    还是 sqlServer的sql啊??我用的是Oracle会报错啊!无效数字!!!楼主
追答

1、这是Oracle的SQL

2、我提供的Model查询基于模拟的数据表结构如下:

create table VISTER
(
  id         NUMBER,
  name       VARCHAR2(20),
  visit_time DATE
)

会不会是字段的类型弄错了?

3、模拟的数据如下:

ID NAME VISIT_TIME

1 张三 2001-10-1 8:15:20

2 张三 2001-10-2 8:15:20

3 张三 2001-10-3 8:15:20

4 张三 2001-10-7 8:15:20

5 张三 2001-10-8 8:15:20

6 张三 2001-10-11 8:15:20

7 张三 2001-10-12 8:15:20

8 张三 2001-10-13 8:15:20

9 张三 2001-10-14 8:15:20

10 张三 2001-10-14 8:15:25

11 张三 2001-10-2 8:15:26

4、这个SQL执行的结果如下:

ID NAME VISIT_TIME

6 张三 2001-10-11 8:15:20

7 张三 2001-10-12 8:15:20

8 张三 2001-10-13 8:15:20

9 张三 2001-10-14 8:15:20

10 张三 2001-10-14 8:15:25

校宏盛00
推荐于2018-03-22 · TA获得超过638个赞
知道小有建树答主
回答量:299
采纳率:0%
帮助的人:271万
展开全部

哪里要这么复杂....鉴于你按每10分钟来连续排列有点奇怪..我写了一个按照日期来连续的sql..

select b.name, min(b.visit_time), max(b.visit_time)
from (
  select a.*, (a.visit_time - rownum) cc
  from (
    select * from vister order by name, visit_time
  ) a
) b
group by b.name, b.cc;
更多追问追答
追问
报错!! select a.*, (a.visit_time - rownum) cc
from (
select * from vister order by name, visit_time
) a
追答

我这边执行没问题..你是什么环境?
另外,报的什么错?

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
曾经黄过
2013-12-12 · TA获得超过109个赞
知道小有建树答主
回答量:185
采纳率:80%
帮助的人:84.3万
展开全部
我给你个思路吧!相必你基本的orcacl操作都会,因为我没有装这相数据,所以也没有办法给你写代码!

第一步:先有count(日期),name,日期(格式为年月日) group by 日期,name (对count进行高到低排列)
第二步:取出最高日期,
第三步:显示最高日期下的详细信息;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
HaiziCattle
2013-12-12 · TA获得超过125个赞
知道小有建树答主
回答量:298
采纳率:0%
帮助的人:193万
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wht8008
2013-12-12 · TA获得超过2061个赞
知道小有建树答主
回答量:2328
采纳率:66%
帮助的人:629万
展开全部
建议使用存储过程吧。
追问
?怎么写?代码!谢谢!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式