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