这是第一种办法,通过inner join(内连接)的形式来实现,
SELECT *
FROM (
SELECT t1.mobile,t1.consumer_no, t1.risk_score, t1.suspicious_register_score, t1.risk_register_score,t1.add_time
FROM (
SELECT re.mobile, re.consumer_no, re.risk_score, re.suspicious_register_score, re.risk_register_score,re.add_time
FROM tmp_arc_tongdun_register_event_di re
WHERE re.pt <= to_char(dateadd(getdate(), 0, 'dd'), 'yyyymmdd')
AND re.consumer_no != 'null'
) t1
inner JOIN (
SELECT MIN(reg.add_time), reg.consumer_no
FROM tmp_arc_tongdun_register_event_di reg
WHERE reg.pt <= to_char(dateadd(getdate(), 0, 'dd'), 'yyyymmdd')
group by reg.consumer_no
) t2 -- 这里注意:找到数据中的时间最小的也就是最早的,需要通过join来实现
ON t1.consumer_no = t2.consumer_no
)as register
INNER JOIN (
SELECT isOverDue.user_id, isOverDue.overdue_day
, CASE
WHEN isOverDue.overdue_day > 3 THEN 1
WHEN isOverDue.overdue_day <= 3 THEN 0
END AS user_type
FROM (
SELECT user_id, MAX(overdue_day) AS overdue_day
FROM lsd_borrow_cash_da
WHERE pt <= TO_CHAR(DATEADD(GETDATE(), -1, 'dd'), 'yyyymmdd')
AND gmt_plan_repayment < GETDATE()
AND status IN (1, 5)
GROUP BY user_id
) isOverDue
) tt2
ON register.consumer_no = tt2.user_id;
还有一种办法就是通过row_number进行实现(mysql中不能使用这种方法),OVER (PARTITION BY consumer_no ORDER BY add_time DESC) AS user_rank,然后在where中添加user_rank= 1,也能实现这样的功能,sql代码如下:
SELECT mobile, consumer_no, risk_score, suspicious_register_score, risk_register_score
,add_time,user_type,overdue_day,user_id
FROM (
SELECT t1.mobile, t1.consumer_no, t1.risk_score, t1.suspicious_register_score, t1.risk_register_score
, t1.add_time, ROW_NUMBER() OVER (PARTITION BY consumer_no ORDER BY add_time DESC) -- row_number()
AS user_rank
FROM (
SELECT re.mobile, re.consumer_no, re.risk_score, re.suspicious_register_score, re.risk_register_score
, re.add_time
FROM tmp_arc_tongdun_register_event_di re
WHERE re.pt <= to_char(dateadd(getdate(), -1, 'dd'), 'yyyymmdd') and re.add_time > '2018-10-15 00:00:00'
) t1
) register
INNER JOIN (
SELECT isOverDue.user_id, isOverDue.overdue_day
, CASE
WHEN isOverDue.overdue_day > 3 THEN 1
WHEN isOverDue.overdue_day = 0 THEN 0
ELSE 2
END AS user_type
FROM (
SELECT user_id, MAX(overdue_day) AS overdue_day
FROM lsd_borrow_cash_da
WHERE pt <= TO_CHAR(DATEADD(GETDATE(), -1, 'dd'), 'yyyymmdd')
AND gmt_plan_repayment < GETDATE()
AND status IN (1, 5)
GROUP BY user_id
) isOverDue
) tt2
ON register.consumer_no = tt2.user_id
where tt2.user_type in (0,1) and register.user_rank =1;