Oracle数据库 sql高手请进来:取出某段时间段内,时间中天数连续的数据
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() 函数
剩下的我会在后台解决!! 展开
直接用查询就可以得到你要的结果:
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
哪里要这么复杂....鉴于你按每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
第一步:先有count(日期),name,日期(格式为年月日) group by 日期,name (对count进行高到低排列)
第二步:取出最高日期,
第三步:显示最高日期下的详细信息;
?怎么写?代码!谢谢!!!
广告 您可能关注的内容 |