阿里云的dataworks分组查找最早(大)或最晚(小)记录的两种方法

 这是第一种办法,通过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;

猜你喜欢

转载自blog.csdn.net/qwertyuiop5rghar/article/details/84775853