题目
有如下一组数据F0408
需求:
第一次召回不计费,后续如果间隔满7天计费,否则不计费,再后续距离上一次计费满7天计费,否则不计费,该如何写这个需求?
预计结果如下:
测试数据
CREATE TABLE F0408
(
UID INT NOT NULL ,
CALLBACK_DATE DATE NOT NULL
)
INSERT INTO F0408 VALUES (1,'2020-4-1')
INSERT INTO F0408 VALUES (1,'2020-4-5')
INSERT INTO F0408 VALUES (1,'2020-4-10')
INSERT INTO F0408 VALUES (1,'2020-4-19')
INSERT INTO F0408 VALUES (2,'2020-4-1')
INSERT INTO F0408 VALUES (2,'2020-4-15')
INSERT INTO F0408 VALUES (2,'2020-4-20')
INSERT INTO F0408 VALUES (2,'2020-4-16')
我的答案
select *,
case when datediff(day,lag(CALLBACK_DATE,1,null) over (partition by UID order by CALLBACK_DATE), CALLBACK_DATE) >= 7 then '计费' else '不计费' end CHARGE
from F0408
想法
这题主要是运用到了 lag over 函数
主要用法和功能
lag(参数1,参数2,参数3)
参数1:表中列名 参数2:往上偏移多少位 参数3:超出行数时默认设置值
同类型的还有lead函数
lead(参数1,参数2,参数3)
参数1:表中列名 参数2:往下偏移多少位 参数3:超出行数时默认设置值
lag和lead 搭配 over 使用
另外用到的是日期函数datediff 这个用法简单,网上找找资料很多(当然lag和lead的函数也是)
当然我这写法不一定是最好的,也希望有大神指正更好的写法