如何解决基于10天筛选器生成SQL序列号Row_Numbers
Customer_Id Call_Date Agent_M_Code Row_Indicator
810471698 2020-03-19 13:25:24.910 rmanzan2 1
810471698 2020-03-22 20:28:19.067 pmaclair 2
810471698 2020-03-24 09:22:47.833 njeanle 3
810471698 2020-03-24 12:36:29.367 edelaro4 4
810471698 2020-03-29 22:36:29.762 kdularo7 1
810471698 2020-04-11 11:21:11.243 rbustam1 1
810471698 2020-04-11 17:50:41.023 frenteri 2
810471698 2020-05-10 11:16:21.683 cschuch2 1
810471698 2020-05-13 15:26:40.660 gledesma 2
810471698 2020-07-03 11:26:20.697 cmataver 1
810471698 2020-07-22 14:19:53.450 irodri13 1
980471627 2020-07-21 14:00:45.923 jgalind8 1
980471627 2020-07-21 14:04:42.277 jabne 2
980471627 2020-07-21 14:06:33.627 abyerley 3
980471627 2020-07-10 07:11:31.817 rbustam1 1
980471627 2020-03-15 22:36:29.763 cmanalot 1
966615610 2020-06-18 17:50:41.023 lmendiza 1
966615610 2020-06-22 14:19:53.450 melli17 2
966615610 2020-01-03 11:16:21.683 gledesma 1
966615610 2020-01-07 15:26:40.660 vchapa1 2
966615610 2020-01-21 11:26:20.697 amanriq1 1
对于上表,我需要基于customer_Id生成row_indicators,但这里的条件是...如果上方Call_Date和下方call_Date在10天之间,则我们需要按顺序生成row_indicator,即(1, 2,3,4 ..)如果不是这样,我们需要从1开始。
我尝试使用LEAD()函数,并通过Customer_Id生成了row_number()分区,但是没有成功。
例如: 在上面的示例表中,前四行在10天之间(小于或等于240小时),然后对于前四行,row_indicators为1,2,4,从第五行开始,Call_Date从1,因为第五行日期不在10天Call_Date范围内。
任何帮助我使用T-SQL脚本的人。
解决方法
您需要使用递归查询:
with
data (select t.*,row_number() over(partition by customer_id order by call_date) rn,cte as (
select d.*,call_date ref_call_date
from data
where rn = 1
union all
select d.*,case when d.call_date > dateadd(day,10,c.ref_call_date) then d.call_date else c.ref_call_date end
from cte c
inner join data d on d.customer_id = c.customer_id and d.rn = c.rn + 1
)
select
c.*,row_number() over(partition by customer_id,ref_call_date order by call_date) new_row_indicator
from cte c
Customer_Id | Call_Date | Agent_M_Code | Row_Indicator | rn | ref_call_date | new_row_indicator ----------: | :---------------------- | :----------- | ------------: | -: | :---------------------- | ----------------: 966615610 | 2020-01-03 11:16:21.683 | gledesma | 1 | 1 | 2020-01-03 11:16:21.683 | 1 966615610 | 2020-01-07 15:26:40.660 | vchapa1 | 2 | 2 | 2020-01-03 11:16:21.683 | 2 966615610 | 2020-01-21 11:26:20.697 | amanriq1 | 1 | 3 | 2020-01-21 11:26:20.697 | 1 980471627 | 2020-03-15 22:36:29.763 | cmanalot | 1 | 1 | 2020-03-15 22:36:29.763 | 1 810471698 | 2020-03-19 13:25:24.910 | rmanzan2 | 1 | 1 | 2020-03-19 13:25:24.910 | 1 810471698 | 2020-03-22 20:28:19.067 | pmaclair | 2 | 2 | 2020-03-19 13:25:24.910 | 2 810471698 | 2020-03-24 09:22:47.833 | njeanle | 3 | 3 | 2020-03-19 13:25:24.910 | 3 810471698 | 2020-03-24 12:36:29.367 | edelaro4 | 4 | 4 | 2020-03-19 13:25:24.910 | 4 810471698 | 2020-03-29 22:36:29.763 | kdularo7 | 1 | 5 | 2020-03-29 22:36:29.763 | 1 810471698 | 2020-04-11 11:21:11.243 | rbustam1 | 1 | 6 | 2020-04-11 11:21:11.243 | 1 810471698 | 2020-04-11 17:50:41.023 | frenteri | 2 | 7 | 2020-04-11 11:21:11.243 | 2 810471698 | 2020-05-10 11:16:21.683 | cschuch2 | 1 | 8 | 2020-05-10 11:16:21.683 | 1 810471698 | 2020-05-13 15:26:40.660 | gledesma | 2 | 9 | 2020-05-10 11:16:21.683 | 2 966615610 | 2020-06-18 17:50:41.023 | lmendiza | 1 | 4 | 2020-06-18 17:50:41.023 | 1 966615610 | 2020-06-22 14:19:53.450 | melli17 | 2 | 5 | 2020-06-18 17:50:41.023 | 2 810471698 | 2020-07-03 11:26:20.697 | cmataver | 1 | 10 | 2020-07-03 11:26:20.697 | 1 980471627 | 2020-07-10 07:11:31.817 | rbustam1 | 1 | 2 | 2020-07-10 07:11:31.817 | 1 980471627 | 2020-07-21 14:00:45.923 | jgalind8 | 1 | 3 | 2020-07-21 14:00:45.923 | 1 980471627 | 2020-07-21 14:04:42.277 | jabne | 2 | 4 | 2020-07-21 14:00:45.923 | 2 980471627 | 2020-07-21 14:06:33.627 | abyerley | 3 | 5 | 2020-07-21 14:00:45.923 | 3 810471698 | 2020-07-22 14:19:53.450 | irodri13 | 1 | 11 | 2020-07-22 14:19:53.450 | 1,
可以使用最早的通话日期和通话日期之间的日期差的整数除法来进行递归操作。
数据(不完整)
drop table if exists #call_data;
go
select * INTO #call_data from (values
('810471698','2020-03-19 13:25:24.910','rmanzan2'),('810471698','2020-03-22 20:28:19.067','2020-03-24 09:22:47.833','2020-03-24 12:36:29.367','2020-03-29 22:36:29.762','2020-04-11 11:21:11.243',('980471627','2020-07-21 14:00:45.923','2020-07-21 14:04:42.277','2020-07-21 14:06:33.627',('966615610','2020-06-18 17:50:41.023','2020-01-21 11:26:20.697','rmanzan2')) V(customer_id,call_date,Agent_M_Code);
查询
;with
rn_cte(customer_id,Agent_M_Code,rn) as (
select *,row_number() over(partition by customer_id order by call_date) rn
from #call_data),grp_cte(customer_id,day_diff_grp) as (
select cd.customer_id,cd.call_date,cd.Agent_M_Code,datediff(d,rn.call_date,cd.call_date)/10
from #call_data cd
left join rn_cte rn on cd.customer_id=rn.customer_id
where rn.rn=1)
select *,row_number() over (partition by customer_id,day_diff_grp order by call_date) row_indicator
from grp_cte
order by 1,2;
输出
customer_id call_date Agent_M_Code day_diff_grp row_indicator
810471698 2020-03-19 13:25:24.910 rmanzan2 0 1
810471698 2020-03-22 20:28:19.067 rmanzan2 0 2
810471698 2020-03-24 09:22:47.833 rmanzan2 0 3
810471698 2020-03-24 12:36:29.367 rmanzan2 0 4
810471698 2020-03-29 22:36:29.762 rmanzan2 1 1
810471698 2020-04-11 11:21:11.243 rmanzan2 2 1
966615610 2020-01-21 11:26:20.697 rmanzan2 0 1
966615610 2020-06-18 17:50:41.023 rmanzan2 14 1
980471627 2020-07-21 14:00:45.923 rmanzan2 0 1
980471627 2020-07-21 14:04:42.277 rmanzan2 0 2
980471627 2020-07-21 14:06:33.627 rmanzan2 0 3
[EDIT]将代码更改为2天滚动窗口:
;with
rn_cte(customer_id,cd.call_date)/2
from #call_data cd
left join rn_cte rn on cd.customer_id=rn.customer_id
where rn.rn=1)
select *,2;
输出
customer_id call_date Agent_M_Code day_diff_grp row_indicator
810471698 2020-03-19 13:25:24.910 rmanzan2 0 1
810471698 2020-03-22 20:28:19.067 rmanzan2 1 1
810471698 2020-03-24 09:22:47.833 rmanzan2 2 1
810471698 2020-03-24 12:36:29.367 rmanzan2 2 2
810471698 2020-03-29 22:36:29.762 rmanzan2 5 1
810471698 2020-04-11 11:21:11.243 rmanzan2 11 1
966615610 2020-01-21 11:26:20.697 rmanzan2 0 1
966615610 2020-06-18 17:50:41.023 rmanzan2 74 1
980471627 2020-07-21 14:00:45.923 rmanzan2 0 1
980471627 2020-07-21 14:04:42.277 rmanzan2 0 2
980471627 2020-07-21 14:06:33.627 rmanzan2 0 3
[EDIT]更改为240小时滚动窗口
;with
rn_cte(customer_id,datediff(hour,cd.call_date)/240
from #call_data cd
left join rn_cte rn on cd.customer_id=rn.customer_id
where rn.rn=1)
select *,2;
输出
customer_id call_date Agent_M_Code day_diff_grp row_indicator
810471698 2020-03-19 13:25:24.910 rmanzan2 0 1
810471698 2020-03-22 20:28:19.067 rmanzan2 0 2
810471698 2020-03-24 09:22:47.833 rmanzan2 0 3
810471698 2020-03-24 12:36:29.367 rmanzan2 0 4
810471698 2020-03-29 22:36:29.762 rmanzan2 1 1
810471698 2020-04-11 11:21:11.243 rmanzan2 2 1
966615610 2020-01-21 11:26:20.697 rmanzan2 0 1
966615610 2020-06-18 17:50:41.023 rmanzan2 14 1
980471627 2020-07-21 14:00:45.923 rmanzan2 0 1
980471627 2020-07-21 14:04:42.277 rmanzan2 0 2
980471627 2020-07-21 14:06:33.627 rmanzan2 0 3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。