SQL小技巧--分组排序

    xiaoxiao2021-03-26  43

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

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

    第一天给我的惊喜不是各种开门红包,而是积攒了半个多月的各种奇怪的八阿哥(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 )

    转载请注明原文地址: https://ju.6miu.com/read-663852.html

    最新回复(0)