rank SQL 筛选重复数据

先思考一个问题:
看下面的表数据
问题:现在需要在 A 和 B 相同的前提下对 C desc排序,然后拿到排序中不是第一个的数据?也就是说拿到下面的数据
只用一条 SQL 实现:
 1 select * from (
 2 select
 3      t.*,
 4      if(@temp_a=t.A and @temp_b=t.B,@rank:=@rank+1,@rank:=1) rank,
 5      @temp_a:=t.A,
 6      @temp_b:=t.B
 7 from
 8      (select * from test order by A asc,B asc,C desc) t,
 9      (select @temp_a:=null,@temp_b:=null,@rank:=null) r
10 ) ret
11 where ret.rank > 1

此 SQL 的关键点就是使用标记变量和空表对数据打 tag,也就是上面的 rank 变量,然后不断迭代判断,对打完标记的表进行过滤即可,用处很多,适当扩展可以实现很多复杂的查询。

posted @ 2018-03-13 13:19  jyf-blog  阅读(681)  评论(0)    收藏  举报