半个多月的春节假期不知不觉就过去了,今天公司也正式开工了,可能是在家待着实在太舒服,以至于第一天的各种不适应,这么多天没碰代码,有种莫名的陌生感,相信
很多人都有这种感觉 (哈哈 新的一年还是继续努力工作 努力 学习 )
第一天给我的惊喜不是各种开门红包,而是积攒了半个多月的各种奇怪的八阿哥(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 )
