求助,用lag函数实现分组,不同账号,同一账号交易超过10天分组

aizhujunzi 2020-07-10 11:10:27
在日常工作中遇到这样问题,有一个表test要数据分析,按照账号和交易时间排序,如果同一账号acc交易时间tran_date 超过10天,则分到一个组,如果上一笔交易和下一笔交易没超过十天,但主题账号变了,也新分到一个组里,如何便携脚本呢,数据样式如下:
acc tran_date
1111111 20191201
1111111 20191202
1111111 20200201
1111112 20200101
1111112 20200501

这里尝试用lag函数
selct acc,tran_date,lag(acc,1,0) over(partity by acc order by acc,tran_date) from test where acc!=lag(acc,1,0) over(partity by acc order by acc,tran_date),这就报错
请各位高人指点
...全文
85 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wildwolv 2020-07-13
  • 打赏
  • 举报
回复
主题账号变了 是什么意思?
nayi_224 2020-07-13
  • 打赏
  • 举报
回复
表结构没贴全吧,明显缺东西。 如果主题账号会变,那上下次交易是按什么规则确定的没有说清楚
aizhujunzi 2020-07-10
  • 打赏
  • 举报
回复
我自己写了一个create table temp_huichu2 as select c.*,sum(jg) OVER(PARTITION BY NULL ORDER BY rn) zu_no from (select ROWNUM rn, b.*, CASE WHEN riqicha > 10 or riqicha <0 THEN 1 ELSE 0 END jg from (select a.*,nvl((tran_date-lag(tran_date,1,0) over(partition by acc order by acc,tran_date asc)),0) as riqicha from temp_jizihuichu a ) b )c select a.*,nvl((to_date(clr_date,'yyyy-mm-dd')-lag(to_date(clr_date,'yyyy-mm-dd'),1,0) over(partition by inter_acct order by inter_acct,clr_date asc)),0) as riqicha from temp_shijiacha_fenzu_ceshi a ; -- 这里就实现了不同账号会分组,因为lag里面的参数变成了0而不是空,所以差值会比较大超过10天,可以比对下和下面语句的效果 select a.*,nvl((tran_date-lag(tran_date,1,1) over( order by acc,tran_date asc)),0) as riqicha from temp_shijiacha_fenzu_ceshi a; select a.*,nvl((tran_date-lag(tran_date,1,1) over(partition by acc order by acc,tran_date asc)),0) as riqicha from temp_shijiacha_fenzu_ceshi a; select a.*,nvl((tran_date-lag(tran_date,1,null) over(order by acc,tran_date asc)),0) as riqicha from temp_shijiacha_fenzu_ceshi a; select a.*,nvl((tran_date-lag(tran_date,1,null) over(partition by acc order by acc,tran_date asc)),0) as riqicha from temp_shijiacha_fenzu_ceshi a; 可以看出账号不同新增分组的关键是partion by acc 和lag里的参数null的设置 但这里取了个巧,是利用分组时,日期相减会比较大超过10天自动新增组,而不是根据账号去判断,然后分组,如果按账号去判断去分组,怎么写啊,大家可以思考一下
js14982 2020-07-10
  • 打赏
  • 举报
回复
lag(acc,1,0) over(partity by acc order by acc,tran_date)里面的partity 拼写错了,partition。selct 是select, 另外where acc!=lag(acc,1,0) over(partity by acc order by acc,tran_date)也不能直接在这用,要写在子查询里面 select * from (select acc,tran_date,lag(acc,1,0) over(partition by acc order by acc,tran_date)l_tran_date from test ) t where tran_date!=l_tran_date ;

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧