Сумма полей первых x строк, смещение +1 в каждой последующей строке

У меня есть таблица в mysql, которая имеет 100 строк с идентификаторами, которые не являются смежными, но могут быть упорядочены по полю даты.

Мне нужно создать запрос, который выбирает сумму полей для 10 самых старых записей, а затем сумму полей от записи 2 до записи 11 и так далее, пока я не достигну 90-100, эти результаты будут сгруппированы по первому столбцу, который число, показывающее, на какой позиции оно находится в расчете.

ex:

Record_id   Sum(field-a) sum(field-b ) sum(field-c)  rows used:
group1      6            3             1             1-10
group2      7            3             0             2-11
group3      7            2             1             3-12

кроме того, добавляются новые строки, и эти вычисления необходимо будет пересчитывать для каждого добавления новой строки, используя последние 100 строк, т. е. строка 1 игнорируется, строка 101 становится 100-й строкой.

надеюсь, это имеет смысл.

Если это слишком много для mysql, php тоже вариант.

Я пробовал некоторые базовые операторы выбора с суммами для каждого поля, ограниченными 10 или 100 записями, и я думаю об ограничении 10 смещений 1, где затем увеличивается смещение.

У меня есть возможность создавать новые таблицы или представления.

заранее спасибо любые идеи или код, которые могут помочь мне прогрессировать.


person Mat    schedule 17.01.2013    source источник


Ответы (2)


Мне кажется, я понимаю, чего вы хотите, но ваш пример запроса ссылается на a, b и c.

Чтобы получить частичные кумулятивные суммы, вам действительно нужен порядковый номер. В MySQL вы получаете это, используя коррелированный подзапрос. Остальное — это самообъединение, за которым следует агрегация:

select concat('group', t.seqnum), sum(t.field) as sum,
       MIN(t2.seqnum) as firstrow, max(t2.seqnum) as lastrow
from (select t.*,
             (select count(*) from t t2 where t2.date <= t.date) as seqnum
      from t
     ) t join
     (select t.*,
             (select count(*) from t t2 where t2.date <= t.date) as seqnum
      from t
     ) t2
     on t2.seqnum between t.seqnum and t.seqnum + 10
group by t.seqnum

Примечание. Этот SQL не тестировался, поэтому в нем могут быть синтаксические ошибки.

person Gordon Linoff    schedule 17.01.2013
comment
извините за ясность: должно быть просто поле a, поле b и поле c, все они в одной таблице - person Mat; 17.01.2013

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

SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT a.i
     , SUM(b.i) ttl
  FROM 
     ( SELECT x.*, COUNT(*) rank FROM ints x JOIN ints y ON y.i <= x.i GROUP BY i ) a
  JOIN
     ( SELECT x.*, COUNT(*) rank FROM ints x JOIN ints y ON y.i <= x.i GROUP BY i ) b
    ON b.rank BETWEEN a.rank-3 AND a.rank
 GROUP 
    BY a.i;
+---+------+
| i | ttl  |
+---+------+
| 0 |    0 |
| 1 |    1 |
| 2 |    3 |
| 3 |    6 |
| 4 |   10 |
| 5 |   14 |
| 6 |   18 |
| 7 |   22 |
| 8 |   26 |
| 9 |   30 |
+---+------+
person Strawberry    schedule 17.01.2013