1. 程式人生 > >Mysql統計時間段內的使用者(去重)

Mysql統計時間段內的使用者(去重)

SELECT b.*
FROM vip_report_vip_income b
	INNER JOIN (SELECT *
		FROM (SELECT a.*
			FROM vip_report_vip_income a
			WHERE 1 = 1
				AND a.game_id = 1005
				AND YEARWEEK(a.`report_date`, 1) >= YEARWEEK('2018-01-27', 1)
				AND YEARWEEK(a.`report_date`, 1) <= YEARWEEK('2018-02-26', 1)
			ORDER BY a.create_time DESC
			) vb
		GROUP BY vip_account_id
		) v ON v.id = b.id

思路:先用2個子句查出最新登入的所有使用者記錄,再聯表對賬號排重

參考:https://stackoverflow.com/questions/6572110/order-by-date-and-time-before-group-by-name-in-mysql/6572292

執行計劃:

SELECT b.*
FROM vip_report_vip_income b
	INNER JOIN (SELECT a.*, MAX(a.create_time) AS latest
		FROM vip_report_vip_income a
		WHERE 1 = 1
			AND a.game_id = 1005
			AND YEARWEEK(a.`report_date`, 1) >= YEARWEEK('2018-01-27', 1)
			AND YEARWEEK(a.`report_date`, 1) <= YEARWEEK('2018-02-26', 1)
		GROUP BY vip_account_id
		) v ON v.vip_account_id = b.vip_account_id
		AND b.create_time = v.latest;

思路:先用1個子句查出最新登入的所有使用者記錄(並排重),另外附加一個max(登入時間),再聯表,根據賬號和登入時間篩查排重

參考:https://stackoverflow.com/questions/10030787/using-order-by-and-group-by-together

執行計劃: