SQL小技巧--分组排序

时间:2021-08-24 00:27:37

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

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

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


有表t_test,结构如下:

SQL小技巧--分组排序

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

实现我们需要的功能呢? 

现在有以下数据

SQL小技巧--分组排序

我们需要修改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
执行结果:

SQL小技巧--分组排序

可以看到达到了我们想要的结果  按照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
)