MySql实现ROW_NUMBER()开窗函数

本文咱们使用mysql实现开窗函数row_number() over (partition by xxx,xxx order by xxx),废话不多说,直接开干

准备数据
select * from test_biz_policy_policy;
platform_id(平台id) publish_time(政策发布时间) policy_name(政策名称)
2 2019-04-01 15:11:06 test0
2 2019-04-01 19:11:06 test9
2 2019-04-01 19:11:06 test8
2 2019-04-01 18:11:06 test7
2 2019-04-01 15:11:06 test1
2 2019-04-01 15:11:06 test2
2 2019-04-01 16:11:06 test3
2 2019-04-01 16:11:06 test4
2 2019-04-01 16:11:06 test5
2 2019-04-01 17:11:06 test6
8 2019-04-02 19:17:31 fengyu
8 2019-04-02 19:17:31 新建政策1111111
8 2019-04-02 19:17:31 1218测试
8 2019-04-02 19:17:31 xxx
8 2019-04-02 19:17:31 ccc
8 2019-04-02 19:17:31 测试114
8 2019-04-02 19:17:31 测试mmm
8 2019-04-02 19:17:31 k k k k k k k
8 2019-04-02 19:17:31 k k k k k k k明明
8 2019-04-02 19:17:31 ceshi111
需求

简而言之,就是以「平台id」,「政策发布时间」分组,根据「政策名称」进行排序,取政策前三名。

代码
SELECT
	t.platform_id,
	t.publish_time,
	t.policy_name,
	t.rank_no 
FROM
	(
	SELECT
		a.platform_id,
		a.publish_time,
		a.policy_name,
	IF
		(
			@str1 = a.platform_id 
			AND @str2 = a.publish_time,
			@rank := @rank + 1,
			@rank := 1 
		) AS rank_no,
		@str1 := a.platform_id,
		@str2 := a.publish_time 
	FROM
		(
		SELECT
			platform_id,
			publish_time,
			policy_name 
		FROM
			test_biz_policy_policy 
		ORDER BY
			platform_id,
			publish_time,
			policy_name ASC 
		) a,
		(
		SELECT
			@str1 := 0,
			@str2 := NULL,
			@rank := 0 
		) tmp 
	) t 
WHERE
	t.rank_no <= 5
结果
platform_id(平台id) publish_time(政策发布时间) policy_name(政策名称)
2 2019-04-01 15:11:06 test0
2 2019-04-01 15:11:06 test1
2 2019-04-01 15:11:06 test2
2 2019-04-01 16:11:06 test3
2 2019-04-01 16:11:06 test4
2 2019-04-01 16:11:06 test5
2 2019-04-01 17:11:06 test6
2 2019-04-01 18:11:06 test7
2 2019-04-01 19:11:06 test8
2 2019-04-01 19:11:06 test9
8 2019-04-02 19:17:31 1218测试
8 2019-04-02 19:17:31 ccc
8 2019-04-02 19:17:31 ceshi111
8 2019-04-02 19:17:31 fengyu
8 2019-04-02 19:17:31 k k k k k k k
总结

从上面的结果看来,需求已实现。

你可能感兴趣的:(大数据,mysql)