MySQL: накапливать вхождения каждого конкретного значения в поле

Я хочу получить поле, которое содержит # номер вхождения значения в поле.

CREATE TABLE `events` (
`id` INT NOT NULL AUTO_INCREMENT,
`country` VARCHAR(2) NOT NULL,
PRIMARY KEY (`id`));

INSERT INTO `events` (`country`) VALUES
('es'), ('fr'), ('uk'),
('uk'), ('es'), ('uk'),
('fr'), ('it'), ('es'),
('es'), ('it'), ('uk'),
('fr'), ('es'), ('de')

То есть, учитывая этот SQLFiddle, я хочу добавить поле accumulated к результатам, содержащим количество раз, которое значение в поле country появился до этого ряда.

SELECT e.*,
(SELECT COUNT(*) FROM `events` AS e2
 WHERE e2.country = e.country) AS times
FROM `events` AS e

ID  | COUNTRY | TIMES | ACCUMULATED
----+---------+-------+------------
1   | es      | 5     | 1
2   | fr      | 3     | 1
3   | uk      | 4     | 1
4   | uk      | 4     | 2
5   | es      | 5     | 2
6   | uk      | 4     | 3
7   | fr      | 3     | 2
8   | it      | 2     | 1
9   | es      | 5     | 3
10  | es      | 5     | 4
11  | it      | 2     | 2
12  | uk      | 4     | 4
13  | fr      | 3     | 3
14  | es      | 5     | 5
15  | de      | 1     | 1

Я думаю, что это какая-то условная SUM, но я не уверен, как.

1 ответ

Решение

Никакой суммы не требуется. Я думаю, что вам просто нужно второе условие "до этого ряда":

select e.*,
       (select count(*) from `events` as e2
        where e2.country = e.country
       ) as times,
       (select count(*) from `events` as e3
        where e3.country = e.country AND e3.id <= e.id
       ) as accumulated
from `events` as e

http://sqlfiddle.com/

Другие вопросы по тегам