求最近连续问题SQL
-- 第四步:求出现最多的diff
SELECT
uid,
MAX(count_uv)
FROM(
-- 第三步:计算日期与排序的diff
SELECT
uid,
DATE_SUB(dt, interval row_rank day ) AS new_dt,
COUNT(1) AS count_uv
FROM (
-- 第二步:将每个用户的登录,按时间排序
SELECT
uid,
dt,
row_number() over( PARTITION BY uid ORDER BY dt) AS row_rank
FROM(
-- 第一步:筛选出每个用户最近7天的记录,每个用户每天只保留一条记录
SELECT
DISTINCT uid,
dt
FROM con_login
WHERE TIMESTAMPDIFF(DAY,dt,NOW()) <= 7
) t1
) t2
GROUP BY uid,DATE_SUB(dt, interval row_rank day)
) t3
GROUP BY uid;
-- 车险最近连续投保年数
/*
1,按身份证分组按起保时间排序
2,起保时间-排序号,如果连续会相等,不连续不相等,根据这个分组求连续个数
3,按身份证分组取最近连续投保年数
整合如下:
SELECT IDENTIFYNUMBER,COUNT_UV FROM
(SELECT IDENTIFYNUMBER,DATE_SUB(START_DATE, INTERVAL ROW_RANK YEAR) AS NEW_DT,COUNT(1) AS COUNT_UV FROM
(SELECT IDENTIFYNUMBER,APPL_DT,START_DATE,ROW_NUMBER() OVER(PARTITION BY IDENTIFYNUMBER ORDER BY START_DATE) AS ROW_RANK FROM
(SELECT DISTINCT IDENTIFYNUMBER,SUBSTRING(APPL_FORM_NO,4,5) AS APPL_DT,START_DATE,RENEW_FLAG FROM BDPMART.DM_CUSTPORTRAIT_CAR_BASE WHERE RENEW_FLAG='1') T1) T2 GROUP BY IDENTIFYNUMBER,DATE_SUB(START_DATE, INTERVAL ROW_RANK YEAR)) T3 ORDER BY NEW_DT DESC LIMIT 1
*/
DROP TABLE IF EXISTS BDPMART.DM_CUSTPORTRAIT_CAR_LTOU;
CREATE TABLE BDPMART.DM_CUSTPORTRAIT_CAR_LTOU DISTRIBUTED BY ('IDENTIFYNUMBER') AS
(
SELECT IDENTIFYNUMBER,APPL_DT,START_DATE,ROW_NUMBER() OVER(PARTITION BY IDENTIFYNUMBER ORDER BY START_DATE) AS ROW_RANK FROM
(SELECT DISTINCT IDENTIFYNUMBER,SUBSTRING(APPL_FORM_NO,4,5) AS APPL_DT,START_DATE,RENEW_FLAG FROM BDPMART.DM_CUSTPORTRAIT_CAR_BASE WHERE RENEW_FLAG='1') T1
);
DROP TABLE IF EXISTS BDPMART.DM_CUSTPORTRAIT_CAR_LTOU_01;
CREATE TABLE BDPMART.DM_CUSTPORTRAIT_CAR_LTOU_01 DISTRIBUTED BY ('IDENTIFYNUMBER') AS
(
SELECT IDENTIFYNUMBER,DATE_SUB(START_DATE, INTERVAL ROW_RANK YEAR) AS NEW_DT,COUNT(1) AS COUNT_UV FROM
BDPMART.DM_CUSTPORTRAIT_CAR_LTOU GROUP BY IDENTIFYNUMBER,DATE_SUB(START_DATE, INTERVAL ROW_RANK YEAR)
);
DROP TABLE IF EXISTS BDPMART.DM_CUSTPORTRAIT_CAR_LTOU_YEAR;
CREATE TABLE BDPMART.DM_CUSTPORTRAIT_CAR_LTOU_YEAR DISTRIBUTED BY ('IDENTIFYNUMBER') AS
(
SELECT IDENTIFYNUMBER,
CASE
WHEN COUNT_UV=0 THEN '0年'
WHEN COUNT_UV=1 THEN '1年'
WHEN COUNT_UV=2 THEN '2年'
ELSE '3年及以上' END AS LTOU_YEAR
FROM
(SELECT IDENTIFYNUMBER,NEW_DT,COUNT_UV,ROW_NUMBER() OVER(PARTITION BY IDENTIFYNUMBER ORDER BY NEW_DT DESC) AS RN FROM BDPMART.DM_CUSTPORTRAIT_CAR_LTOU_01) T WHERE T.RN=1
);