MySQL - 组内的计数器

时间:2013-11-18 18:58:35

标签: mysql

我想根据升序变量为组中的每一行添加一个计数器。我有一个解决方案,但如果组内的某个变量相等,它就不起作用:

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
;    

我得到的是:

--------------------
| g | x  | counter |
--------------------
| a |  1 |    1    |  
| a |  2 |    2    |  
| a | 10 |    3    |
| b |  1 |    1    |
| b |  1 |    1    |
| b | 10 |    3    |
--------------------

但我想得到:

--------------------
| g | x  | counter |
--------------------
| a |  1 |    1    |  
| a |  2 |    2    |  
| a | 10 |    3    |
| b |  1 |    1    |
| b |  1 |    2    |
| b | 10 |    3    |
--------------------

知道如何解决这个问题吗?非常感谢提示。

1 个答案:

答案 0 :(得分:1)

解决此问题时,用户定义的变量会变得很方便。这应该有效:

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

如果您不介意第四列,那么您可以安全地删除外部选择。这将大大提高性能。