SQL每日一题(20220408)

题目

有如下一组数据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的函数也是)

当然我这写法不一定是最好的,也希望有大神指正更好的写法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值