阿里雲的dataworks分組查詢最早(大)或最晚(小)記錄的兩種方法
阿新 • • 發佈:2018-12-13
這是第一種辦法,通過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;