2015-09-23 3 views
1

Представьте таблицу SQL votes с двумя столбцами vote и time; vote - это строка, time - это временная метка. Я хотел бы получить «совокупный счет» из таблицы. Таким образом, таблица выглядит следующим образом:Совокупный счет (*) в MySQL

vote  | time 
-----------+---------------- 
stuart  | 1443000000 
stuart  | 1443000000 
bryan  | 1443000000 
stuart  | 1443000001 
bryan  | 1443000001 
bryan  | 1443000002 
bryan  | 1443000002 

так, «Stuart» получает два голоса в первом временном интервале и «Bryan» получает один; они получают по одному во втором интервале, и Bryan получает еще два в третьей, и, таким образом, выходные результаты я хотел бы следующие:

vote  | time   | cumulative total 
-----------+--------------+----------------- 
stuart  | 1443000000 | 2 
bryan  | 1443000000 | 1 
stuart  | 1443000001 | 3 
bryan  | 1443000001 | 2 
stuart  | 1443000002 | 3 
bryan  | 1443000002 | 4 

Я не знаю, как это сделать. Очевидно, что количество голосов, полученных за каждый промежуток времени, тривиально (SELECT vote, time, COUNT(*) from table GROUP BY time, vote ORDER BY time, vote), но сделать совокупный счет кажется сложнее. Есть ли способ сделать это?

(я использую MySQL, и я рад использовать MySQL-специфические функции здесь, если полезно.)

+0

Использование коррелированного подзапроса для подсчета? – jarlh

ответ

5

Использование коррелированный подзапрос сделать подсчет:

select distinct vote, time, (select count(*) from table t2 
          where t2.vote = t1.vote 
           and t2.time <= t1.time) 
from table t1 
+0

FROM t1 напрямую, вам не нужно ключевое слово TABLE – Mihai

+0

@Mihai, я вас сюда не привел? Не могли бы вы объяснить, что вы имеете в виду? – jarlh

+0

Также он не будет работать, так как t1.vote = t2.vote создаст перекрестное соединение, и ваши четкие удалят нужные строки. – Mihai

0

Ok, если Вам действительно нужно, что stuart | 1443000002 | 3 строки, то вы можете сделать это:

select distinct vote, time, 
     (select count(*) from `table` t2 
     where t2.vote = t1.vote 
     and t2.time <= t1.time) `cumulative total` 
from (select distinct t3.vote vote, t4.time time 
     from `table` t3, `table` t4) t1; 

Вот SQL Скрипки: http://sqlfiddle.com/#!9/960d6/11/0

Нам нужно сделать таблицу, содержащую КАЖДУЮ комбинацию имен и времени (объединение без условий), а затем вычислить подсчеты из исходной таблицы, используя все эти комбинации.

Благодаря @jarlh для запроса в его ответе - не нужно начинать с нуля, сохранял кучу времени.