mysql 组内计数,MySQL-组内计数器

I would like to add a counter for each row within a group according an ascending variable. I have a solution but it does not work if some variable within groups are equal:

CREATE TABLE tb (

g CHAR(1)

, x INTEGER

);

INSERT INTO tb (g, x)

VALUES

('a',1)

, ('a',2)

, ('a',10)

, ('b',1)

, ('b',1)

, ('b',10)

;

SELECT g,x, (SELECT COUNT(*)

FROM tb b

WHERE a.g = b.g

AND a.x > b.x

) + 1 AS counter

FROM tb a

;

What I get is:

--------------------

| g | x | counter |

--------------------

| a | 1 | 1 |

| a | 2 | 2 |

| a | 10 | 3 |

| b | 1 | 1 |

| b | 1 | 1 |

| b | 10 | 3 |

--------------------

But I would like to get:

--------------------

| g | x | counter |

--------------------

| a | 1 | 1 |

| a | 2 | 2 |

| a | 10 | 3 |

| b | 1 | 1 |

| b | 1 | 2 |

| b | 10 | 3 |

--------------------

Any idea how I can solve this problem? Thanks a lot for hints.

giordano

解决方案

User Defined Variables become handy when solving this issues. This should work:

select g, x, counter from (

select g, x,

@counter := if (g = @prev_g, @counter + 1, 1) counter,

@prev_g := g

from tb, (select @counter := 0, @prev_g := null) init

order by g, x

) s

If you don't really mind the fourth column then you could safely remove the outer select. That would improve performance a lot.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值