Имеются данные в таком виде:
+------------+------+-------+------+
| date | uid | page | hit |
+------------+------+-------+------+
| 2013-03-25 | 1 | main | 10 |
+------------+------+-------+------+
| 2013-03-25 | 1 | about | 2 |
+------------+------+-------+------+
| 2013-03-25 | 2 | main | 1 |
+------------+------+-------+------+
| 2013-03-26 | 1 | main | 3 |
+------------+------+-------+------+
dumpCREATE TABLE page_stat(
`id` int NOT NULL auto_increment,
`date` date,
`uid` int,
`page` varchar(64),
`hit` int,
PRIMARY KEY (`id`)
);
INSERT INTO page_stat (date, uid, page, hit) values
('2013-03-25', 1, 'main', 10),
('2013-03-25', 1, 'about', 2),
('2013-03-25', 2, 'main', 1),
('2013-03-26', 1, 'main', 3);
Т.е. за каждый день ведется учет сколько пользователь посещал тот или иной раздел.
С подсчетом посещений каждого раздела все понятно:
SELECT page, sum(hit) hits FROM page_stat GROUP BY page;
Результат+-------+------+
| page | hits |
+-------+------+
| about | 2 |
| main | 14 |
+-------+------+
Теперь необходимо посчитать количество уникальных пользователей по каждому разделу.
Результат должен быть такой:
+-------+------+
| page | uniq |
+-------+------+
| about | 1 |
| main | 2 |
+-------+------+
Максимум что удалось придумать это
SELECT page, count(DISTINCT uid) uniq FROM page_stat GROUP BY page;
Но такой запрос на реальных данных обрабатывается больше минуты.
Насколько я понимаю в таком запросе на каждый page неявно делается
SELECT DISTINCT uid FROM page_stat WHERE page=...
Какие еще есть варианты поручить данные по уникальным пользователям? Допускается модификация структуры хранения данных.
UPD Необходим был индекс (page, uid)