我想根据一个升序变量为组中的每一行添加一个计数器。我有一个解决方案,但如果组内的某个变量相等,则不起作用:
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 |
--------------------知道我怎么能解决这个问题吗?非常感谢你的暗示。
佐达诺
发布于 2013-11-18 19:11:03
用户定义的变量在解决这个问题时变得很方便。这应该是可行的:
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如果您不介意第四列,那么可以安全地删除外部select。这将大大提高性能。
https://stackoverflow.com/questions/20055644
复制相似问题