2009-07-11 1 views
0

Учитывая набор данных, подобный этому;GROUP BY ID диапазон?

+-----+---------------------+--------+ 
| id | date    | result | 
+-----+---------------------+--------+ 
| 121 | 2009-07-11 13:23:24 |  -1 | 
| 122 | 2009-07-11 13:23:24 |  -1 | 
| 123 | 2009-07-11 13:23:24 |  -1 | 
| 124 | 2009-07-11 13:23:24 |  -1 | 
| 125 | 2009-07-11 13:23:24 |  -1 | 
| 126 | 2009-07-11 13:23:24 |  -1 | 
| 127 | 2009-07-11 13:23:24 |  -1 | 
| 128 | 2009-07-11 13:23:24 |  -1 | 
| 129 | 2009-07-11 13:23:24 |  -1 | 
| 130 | 2009-07-11 13:23:24 |  -1 | 
| 131 | 2009-07-11 13:23:24 |  -1 | 
| 132 | 2009-07-11 13:23:24 |  -1 | 
| 133 | 2009-07-11 13:23:24 |  -1 | 
| 134 | 2009-07-11 13:23:24 |  -1 | 
| 135 | 2009-07-11 13:23:24 |  -1 | 
| 136 | 2009-07-11 13:23:24 |  -1 | 
| 137 | 2009-07-11 13:23:24 |  -1 | 
| 138 | 2009-07-11 13:23:24 |  1 | 
| 139 | 2009-07-11 13:23:24 |  0 | 
| 140 | 2009-07-11 13:23:24 |  -1 | 
+-----+---------------------+--------+ 

Как бы я мог группировать результаты по 5-дневным записям за один раз. Вышеприведенные результаты являются частью живых данных, в таблице содержится более 100 000 строк результатов и их рост. В принципе, я хочу измерить изменение с течением времени, поэтому хочу взять СУММУ результата каждые X записей. В реальных данных я буду делать это когда-либо 100 или 1000, но для данных выше, возможно, каждые 5.

Если бы я мог сортировать по дате, я бы сделал что-то вроде этого;

SELECT 
    DATE_FORMAT(date, '%h%i') ym, 
    COUNT(result) 'Total Games', 
    SUM(result) as 'Score' 
FROM nn_log 
GROUP BY ym; 

Я не могу найти способ сделать что-то подобное с числами. Порядок сортируется по дате, но я надеюсь разбить данные на каждый x результатов. Можно с уверенностью предположить, что нет пустых строк.

Выполнение этого выше с данными, которые вы могли бы сделать несколькими выборами;

SELECT SUM(result) FROM table LIMIT 0,5; 
SELECT SUM(result) FROM table LIMIT 5,5; 
SELECT SUM(result) FROM table LIMIT 10,5; 

Это явно не очень хороший способ масштабирования до более крупной проблемы. Я мог бы просто написать цикл, но я хотел бы уменьшить количество запросов.

ответ

4

Как насчет ...

SELECT 
    floor(id/5) ym, 
    COUNT(result) 'Total Games', 
    SUM(result) as 'Score' 
FROM nn_log 
GROUP BY ym; 

(я предполагаю, что идентификатор коррелятивный)

Это та же идея в вашем запросе, только с использованием идентификатора для группы вместо дня.

+0

Прекрасное спасибо. Интересно, что это дало мне только 999 для первого ... но я могу жить с этим. MySQL> SELECT -> этаж (ID/1000) мкм, -> COUNT (результат) 'Всего игр, -> SUM (результат) как 'Счет' -> ОТ nn_log -> GROUP BY YM ; + ------ + ------------- + ------- + | ym | Всего игр | Оценка | + ------ + ------------- + ------- + | 0 | 999 | -879 | | 1 | 1000 | -889 | | 2 | 1000 | -920 | | 3 | 1000 | -903 | .... –

+0

d oh - форматирование сбоя lol –

4

Для этого можно использовать целочисленное деление на ROWNUMBER.

Если вы уверены, что ваша id колонка consecuitive просто использовать: GROUP BY ПОЛ (идентификатор/5)

0

группа по годам (your_date), неделя (your_date)

, которые группа по 7-дневными интервалами, которые могли бы работать для вас.