• 全部
  • Oracle 基础和管理
  • Oracle 高级技术
  • Oracle 认证与考试
  • 职位交流
  • 问答

help!!!hive sql求学生连续报读次数,两次报读时间在半年内算一次

_dack 学生  2018-06-11 03:57:51
例如:学生A有三条记录,三个时间分别为2017-1-1,2017-3-1,2017-10-1,
那么连续报读次数为1;
学生B有三条记录:三个时间分别为2017-1-1,2017-3-1,2017-8-30,
那么连续报读次数为2;


求help!!
...全文
1031 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bigdata-sb 2018-06-25
如何算连续报读??
回复
游灬魂 2018-06-15
[quote=引用 6 楼 hi537638 的回复:] with t1 as ( select 'A' id1, date'2017-1-1' start_date from dual union all select 'A' id1, date'2017-8-1' start_date from dual union all select 'A' id1, date'2017-10-1' start_date from dual union all select 'A' id1, date'2017-11-1' start_date from dual union all select 'A' id1, date'2017-12-1' start_date from dual union all select 'A' id1, date'2018-7-1' start_date from dual union all select 'A' id1, date'2018-10-1' start_date from dual union all select 'A' id1, date'2018-11-1' start_date from dual union all select 'B' id1, date'2017-12-1' start_date from dual union all select 'B' id1, date'2018-7-1' start_date from dual union all select 'B' id1, date'2018-10-1' start_date from dual union all select 'B' id1, date'2018-11-1' start_date from dual UNION ALL select 'B' id1, date'2019-10-1' start_date from dual union all select 'B' id1, date'2020-11-1' start_date from dual ) , t2 as (select id1 ,start_date start_day ,nvl(lead(start_date) over(partition by id1 order by start_date),date'2999-12-31') end_day ,row_number() over(partition by id1 order by start_date) rn from t1) select id1 ,max(num1) --最大连续次数 from ( SELECT ID1,TYPE1,COUNT(1) num1 FROM (select rn-rn1 TYPE1 ,a1.* from ( select a.* ,row_number() over(partition by id1 order by start_day) rn1 from (select t2.id1 ,t2.rn ,t2.start_day ,t2.end_day ,case when add_months(t2.start_day,6) > t2.end_day then 1 else 0 end lx_rn from t2 where case when add_months(t2.start_day,6) > t2.end_day then 1 else 0 end > 0 ) a ) a1 ) A2 GROUP BY ID1,TYPE1) group by id1 ; 不需要加1了的,看成连续次数了
回复
游灬魂 2018-06-15
with t1 as ( select 'A' id1, date'2017-1-1' start_date from dual union all select 'A' id1, date'2017-8-1' start_date from dual union all select 'A' id1, date'2017-10-1' start_date from dual union all select 'A' id1, date'2017-11-1' start_date from dual union all select 'A' id1, date'2017-12-1' start_date from dual union all select 'A' id1, date'2018-7-1' start_date from dual union all select 'A' id1, date'2018-10-1' start_date from dual union all select 'A' id1, date'2018-11-1' start_date from dual union all select 'B' id1, date'2017-12-1' start_date from dual union all select 'B' id1, date'2018-7-1' start_date from dual union all select 'B' id1, date'2018-10-1' start_date from dual union all select 'B' id1, date'2018-11-1' start_date from dual UNION ALL select 'B' id1, date'2019-10-1' start_date from dual union all select 'B' id1, date'2020-11-1' start_date from dual ) , t2 as (select id1 ,start_date start_day ,nvl(lead(start_date) over(partition by id1 order by start_date),date'2999-12-31') end_day ,row_number() over(partition by id1 order by start_date) rn from t1) select id1 ,max(num1)+1 --最大连续次数 from ( SELECT ID1,TYPE1,COUNT(1) num1 FROM (select rn-rn1 TYPE1 ,a1.* from ( select a.* ,row_number() over(partition by id1 order by start_day) rn1 from (select t2.id1 ,t2.rn ,t2.start_day ,t2.end_day ,case when add_months(t2.start_day,6) > t2.end_day then 1 else 0 end lx_rn from t2 where case when add_months(t2.start_day,6) > t2.end_day then 1 else 0 end > 0 ) a ) a1 ) A2 GROUP BY ID1,TYPE1) group by id1 ; 看看这种
回复
zbdzjx 2018-06-12
引用 4 楼 zbdzjx 的回复:
[quote=引用 2 楼 Dack_Huang 的回复:] 有点强,但是有个问题,这样求的是所有连续报读次之和,我这个需求想求的是最大连续次数 当5个时间分别为2017-1-1, 2017-3-1, 2017-10-1, 2017-11-1, 2018-8-1的时候,应该为2,而不是3
这5个日期,计算出来应该也是2啊。 除非是2017-1-1、2017-3-1、2017-10-1、2017-11-1、2017-12-1这样的5个日期,前2个一组,后3个一组,想要计算出结果是2。[/quote] 仔细想了一下,感觉逻辑还是不对。
回复
zbdzjx 2018-06-12
引用 2 楼 Dack_Huang 的回复:
有点强,但是有个问题,这样求的是所有连续报读次之和,我这个需求想求的是最大连续次数 当5个时间分别为2017-1-1, 2017-3-1, 2017-10-1, 2017-11-1, 2018-8-1的时候,应该为2,而不是3
这5个日期,计算出来应该也是2啊。 除非是2017-1-1、2017-3-1、2017-10-1、2017-11-1、2017-12-1这样的5个日期,前2个一组,后3个一组,想要计算出结果是2。
回复
_dack 2018-06-12
引用 1 楼 zbdzjx 的回复:
with t1 as
(
  select 'A' c1, '2017-1-1' c2 from dual union all
  select 'A' c1, '2017-10-1' c2 from dual union all
  select 'A' c1, '2017-3-1' c2 from dual union all

  select 'B' c1, '2017-1-1' c2 from dual union all
  select 'B' c1, '2017-3-1' c2 from dual union all
  select 'B' c1, '2017-8-30' c2 from dual
)
, t2 as
(
  select row_number() over(order by c1, to_date(c2, 'yyyy-mm-dd')) rn, c1, to_date(c2, 'yyyy-mm-dd') c2 from t1
)
select a.c1, sum(case when b.c1 is not null and months_between(b.c2, a.c2)<=6 then 1 else 0 end)
from t2 a 
left join t2 b on a.c1=b.c1 and a.rn=b.rn-1 
group by a.c1
有点强,但是有个问题,这样求的是所有连续报读次之和,我这个需求想求的是最大连续次数 当5个时间分别为2017-1-1, 2017-3-1, 2017-10-1, 2017-11-1, 2018-8-1的时候,应该为2,而不是3
回复
_dack 2018-06-12
有点强,但是有个问题,这样求的是所有连续报读次之和,我这个需求想求的是最大连续次数 当5个时间分别为2017-1-1, 2017-3-1, 2017-10-1, 2017-11-1, 2018-8-1的时候,应该为2,而不是3
回复
zbdzjx 2018-06-12
with t1 as
(
  select 'A' c1, '2017-1-1' c2 from dual union all
  select 'A' c1, '2017-10-1' c2 from dual union all
  select 'A' c1, '2017-3-1' c2 from dual union all

  select 'B' c1, '2017-1-1' c2 from dual union all
  select 'B' c1, '2017-3-1' c2 from dual union all
  select 'B' c1, '2017-8-30' c2 from dual
)
, t2 as
(
  select row_number() over(order by c1, to_date(c2, 'yyyy-mm-dd')) rn, c1, to_date(c2, 'yyyy-mm-dd') c2 from t1
)
select a.c1, sum(case when b.c1 is not null and months_between(b.c2, a.c2)<=6 then 1 else 0 end)
from t2 a 
left join t2 b on a.c1=b.c1 and a.rn=b.rn-1 
group by a.c1
回复
相关推荐
发帖
Oracle
创建于2007-09-28

1.6w+

社区成员

Oracle开发相关技术讨论
申请成为版主
帖子事件
创建了帖子
2018-06-11 03:57
社区公告
暂无公告