有一张表:dengji_hotel;
id (id号)
name (旅客姓名)
rz_date(入住时间)
hotel_name(旅馆名称)
hotel_room(房间号) 这张表有几百万的数据:
如何高效率的检索出:
在40分钟内,住在同一旅馆并同一房间的数据
下面可以统计同一天内,那40分钟内呢?怎么改?
select * from dengji_hotel where rowid in (
select rid from (
  select count(id)over(partition by trunc(rz_date),hotel_name,hotel_room)as rank_id, rowid as rid from dengji_hotel
)
where rank_id >= 2
)

解决方案 »

  1.   

    select * from dengji_hotel where rowid in (
    select rid from (
      select count(id)over(partition by trunc(rz_date),hotel_name,hotel_room)as rank_id, rowid as rid from dengji_hotel where rz_date<sysdate-40/1440
    )
    where rank_id >= 2
    )
      

  2.   

    tgm78,谢谢你的回答,但是不是和现在时间比较,是任意40分钟内,肯请回答
      

  3.   

    任意40分钟内?你总得给个坐标吧,不然怎么说是40分钟内呢
    sysdate就是坐标,你可以把它替换成你需要的时间点为坐标
      

  4.   

    假如一条记录rz_date为2006-08-11 20:16:25,另一个为2006-08-11 20:30:23
    ,这两个时间间隔不超过40分钟,则满足要求;
    假如一条记录rz_date为2006-08-11 20:16:25,另一个为2006-08-11 21:30:23
    ,这两个时间间隔超过40分钟,则不满足要求;
      

  5.   

    我的意思就是把我写的sysdate替换成你的2006-08-11 20:16:25即可
    这个2006-08-11 20:16:25就是你的坐标
      

  6.   

    select * from dengji_hotel where rowid in (
    select rid from (
      select count(id)over(partition by trunc(rz_date),hotel_name,hotel_room)as rank_id, rowid as rid from dengji_hotel and where rz_date>to_date(2006-08-11 20:16:25) rz_date<to_date(2006-08-11 20:16:25)+40/1440
    )
    where rank_id >= 2
    )
      

  7.   

    select * from dengji_hotel where rowid in (
    select rid from (
      select count(id)over(partition by trunc(rz_date),hotel_name,hotel_room)as rank_id, rowid as rid from dengji_hotel and where rz_date>to_date(2006-08-11 20:16:25) rz_date<to_date(2006-08-11 20:16:25)+40/1440
    )
    where rank_id >= 2
    )
    坐标不固定,可以使用通配符号&。比如select * from dengji_hotel where rowid in (
    select rid from (
      select count(id)over(partition by trunc(rz_date),hotel_name,hotel_room)as rank_id, rowid as rid from dengji_hotel and where rz_date>to_date(&1) rz_date<to_date(&1)+40/1440
    )
    where rank_id >= 2
    )按照提示输入坐标时间即可
      

  8.   

    嗯,感觉差不多了,但是我要一次性把符合要求的记录全部查询出来,是不是要写proc,能否提示?
      

  9.   

    这个sql就是一次性把复核你设定的坐标时间之内的所有记录头提取出来啊
      

  10.   

    应该是:select * from dengji_hotel where rowid in (
    select rid from (
      select count(id)over(partition by trunc(rz_date),hotel_name,hotel_room)as rank_id, rowid as rid from dengji_hotel and where rz_date>to_date(&1,'yyyymmdd hh24:mi:ss') rz_date<to_date(&1,'yyyymmdd hh24:mi:ss')+40/1440
    )
    where rank_id >= 2
    )
      

  11.   

    lz用我修改的sql,依次输入
    2006-12-06 11:23:04
    2006-12-06 11:26:01
    2006-12-06 11:33:04
    2006-12-06 18:59:09
    2006-12-06 19:01:11即可
      

  12.   

    lz必须要给出坐标,才可以说四十分钟内的。撇开sql语句不说,日常生活中,你可以这么说:
    从12点15分开始的四十分钟内
    从10点18分开始的四十分钟内
    ......
    你可以说:从今天任意时间开始四十分钟内,别人如何定位?
      

  13.   

    tgm78误会了,表并不缺少字段。我只要求统计出入住时间中,连续入住时间在40分钟内,住同一旅馆的数据和住宿时间、退住时间无关系.
      

  14.   

    select * from dengji_hotel where rowid in (
    select rid from (
      select count(id)over(partition by trunc(rz_date),hotel_name,hotel_room)as rank_id, rowid as rid from dengji_hotel where sysdate-rz_date>=40
    )
    where rank_id >= 2
    )这个是给出到目前时间(sysdate)为止,入住时间超过40分钟的记录。
    至于别的时间,还是要给你参考坐标点。替换sysdate即可。
    lz我只能理解你的意思到这一步了。
      

  15.   

    Oracle 的 datediff 不会做,大致上用下面的语句可以将所有符合条件的记录取出来,要统计再自己改一下:
    select t1.* from dengji_hotel t2
    where exists (
      select * from dengji_hotel t2
      where t2.hotel_name = t1.hotel_name
      and t2.hotel_room = t2.hotel_room
      and (  (t2.rz_date > t1.rz_date - 40min)
           or(t2.rz_date < t1.rz_date + 40min)
          )
      

  16.   

    上面有不少的好方法了 不过我的建议是弄清楚客户到底需要什么东西 他说的不一定是他想要的 很有可能说错了 上百万的数据乱折腾很容易over的