語法:
VARCHAR DATE_SUB(VARCHAR startdate, INT days) VARCHAR DATE_SUB(TIMESTAMP time, INT days)
參數:
參數 | 數據類型 |
startdate |
VARCHAR |
time | TIMESTAMP |
days | INT |
定義:返回startdate減去days天數的日期。返回VARCHAR類型的yyyy-MM-dd日期格式。若有參數為null或解析錯誤,返回null。
測試案例:
SELECT DATE_SUB(date1, 30) as var1, DATE_SUB(TIMESTAMP '2017-10-15 23:00:00',30) as var2, DATE_SUB(nullstr,30) as var3 FROM T1
測試結果:
var1(VARCHAR) | var2(VARCHAR) | var3(VARCHAR) |
---|---|---|
2017-09-15 | 2017-09-15 | null |
場景案例:
-- 編寫連續7天登錄的總人數
t1表
Uid dt login_status(1登錄成功,0異常)
1 2019-07-11 1
1 2019-07-12 1
1 2019-07-13 1
1 2019-07-14 1
1 2019-07-15 1
1 2019-07-16 1
1 2019-07-17 1
1 2019-07-18 1
2 2019-07-11 1
2 2019-07-12 1
2 2019-07-13 0
2 2019-07-14 1
2 2019-07-15 1
2 2019-07-16 0
2 2019-07-17 1
2 2019-07-18 0
3 2019-07-11 1
3 2019-07-12 1
3 2019-07-13 1
3 2019-07-14 1
3 2019-07-15 1
3 2019-07-16 1
3 2019-07-17 1
3 2019-07-18 1
-- 建表
create table if not exists c_t1(
uid int,
dt string,
login_status int
)
row format delimited fields terminated by ' '
;
-- 導入數據
load data local inpath '/opt/datas/t1.txt' into table c_t1;
-- 思路一
select
uid,
dt,
row_number() over(distribute by uid sort by dt) rm
from c_t1
where login_status = 1
; t1
-- 思路二
select
t.uid,
date_sub(t1.dt,dt.rm) dt
from
(
select
uid,
dt
row_number() over(distribute by uid sort by dt) rm
from c_t1
where login_status = 1
)t1
; t2
-- 思路三
select
uid,
dt
from
(
select
t1.uid,
date_sub(t1.dt,t1.rm) dt
from
(
select
uid,
dt,
row_number() over(distribute by uid sort by dt) rm
from c_t1
where login_status = 1
)t1
)t2
group by
uid,
dt
having
count(uid) > 7
;