SQL小技巧--分组排序

半个多月的春节假期不知不觉就过去了,今天公司也正式开工了,可能是在家待着实在太舒服,以至于第一天的各种不适应,这么多天没碰代码,有种莫名的陌生感,相信

很多人都有这种感觉  (哈哈  新的一年还是继续努力工作 努力 学习  )

第一天给我的惊喜不是各种开门红包,而是积攒了半个多月的各种奇怪的八阿哥(bug),碰巧看到之前写的一段sql,记忆有些模糊,这里记录下以免下次真的忘记了


有表t_test,结构如下:

假如我需要跟着class_code 分组同时按照score从高到低排名,这个时候该怎么处理呢  第一时间我们会想到group by 但是这里的分组  只能作为统计合并使用,那怎样才能

实现我们需要的功能呢? 

现在有以下数据

我们需要修改class_code 为 1 和 2 中 score排名为  2 到 5 记录的 status状态为 0 ,首先我们得知道class_code为1和2时候score的排名情况

这里需要使用的sql的临时变量,定义@_GROUP_ROW,@_CLASS_CODE两个临时变量

SELECT @_GROUP_ROW:=1,@_CLASS_CODE:=''
分组排序的语句实例:

SELECT
	@_GROUP_ROW := (
		CASE
		WHEN @_CLASS_CODE = test.CLASS_CODE THEN
			@_GROUP_ROW + 1
		ELSE
			1
		END
	) GROUP_ROW ,@_CLASS_CODE := test.CLASS_CODE CLASS_CODE,
	test.ID,
	score
FROM
	(
		SELECT
			@_GROUP_ROW := 1 ,@_CLASS_CODE := ''
	) a,
	T_TEST test
ORDER BY
	CLASS_CODE,
	SCORE DESC
执行结果:

可以看到达到了我们想要的结果  按照class_code分组下 按照score从高到低的排名  

最后为了实现我们需求,只需要对sql进行拓展如下:

UPDATE T_TEST t
SET STATUS = 0
WHERE
	EXISTS (
		SELECT
			1
		FROM
			(
				SELECT
					@_GROUP_ROW := (
						CASE
						WHEN @_CLASS_CODE = test.CLASS_CODE THEN
							@_GROUP_ROW + 1
						ELSE
							1
						END
					) GROUP_ROW ,@_CLASS_CODE := test.CLASS_CODE CLASS_CODE,
					test.ID,
					score
				FROM
					(
						SELECT
							@_GROUP_ROW := 1 ,@_CLASS_CODE := ''
					) a,
					T_TEST test
				ORDER BY
					CLASS_CODE,
					SCORE DESC
			) p1
		WHERE
			t.ID = p1.ID
		AND p1.GROUP_ROW BETWEEN 2 AND 5
	)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值