Нужен хитрый запрос на sql

RealFikus

Добрый день!
Помогите написать хитрый запрос на SQL. Есть сайт с базой MySQL, написанный на PHP. В базе есть таблица со списком значений, которые попадали туда в зависимости от времени. Нужно как бы отсортировать все записи по времени, разделить на указанное количество групп по равному количеству записей и для каждой группы вывести среднее значение.
Т.е. если в таблице 100 записей и требуется 10 групп, то в результате должен получится столбец:
Avg(записи с 1 по 10)
Avg(записи с 10 по 11)
и т.д.
Заранее благодарен за помощь.

zya369

 
DB2BATCH> create table x(id integer, time integer)@@
...
DB2BATCH> select * from @
ID TIME
----------------------------
1 2
2 5
13 6
16 8
DB2BATCH> select cast(id/10 as integeravg(time) from x group by cast(id/10 as integer)@@
1 2
----------------------------
0 3
1 7

PS почему DB2 считает avg как интегер - хз...
на постгресе все ок:
 
create table x(id integer, time integer)ж
insert into x values(1,2);insert into x values(2,5);insert into x values(13,6);insert into x values(16,8);
select * from x;
id | time
----+------
1 | 2
2 | 5
13 | 6
16 | 8
(4 rows)
select cast(id/10 as integeravg(time) from x group by cast(id/10 as integer);
int4 | avg
------+--------------------
1 | 7.0000000000000000
0 | 3.5000000000000000
(2 rows)

RealFikus

А без поля id нельзя?

zya369

это же очевидно :
select avg(time) from x group by cast(id/10 as integer);  

kruzer25

Что очевидно?

ava3443

а что нельзя?

Svyatogor

Должно быть очевидно, что и понимают условие задачи по-разному. В понимании фраза
Avg(записи с 1 по 10)
значит, что это первые 10 записей по порядку среди отсортированных по времени. В понимании же это записи, которые имеют некоторый номер (id от одного до десяти (т.е., например, при автоматической нумерации).

kruzer25

и понимают условие задачи по-разному
Вот и у меня возникло такое ощущение... на что я попытался указать .
ЗЫ: А почему
cast(id/10 as integer)
, а не
FLOOR(`id`/10)
?

zya369

блин, ну неужели сложно додумать?
добавить сортировку и заменить id на какой-нить rownum (в зависимости от базы)
ЗЫ касаемо cast И floor - просто что в голову пришло, то и написал, к тому же floor'ом я не пользовался никогда

kruzer25

добавить сортировку и заменить id на какой-нить rownum
А можно поподробнее?
ЗЫ касаемо cast И floor - просто что в голову пришло, то и написал, к тому же floor'ом я не пользовался никогда
Просто у меня такое ощущение, что поведение cast-а может быть разное в разных услвиях... например, округлять не до ближайшего целого снизу, а просто до ближайшего целого.

zya369

А можно поподробнее?

 
SQL> select time,row_number over floor( (row_number over / 2) as rowNo from x
+------------+---------------------+---------------------+
| TIME | 2 | ROWNO |
+------------+---------------------+---------------------+
| 2 | 1 | 0 |
| 5 | 2 | 1 |
| 6 | 3 | 1 |
| 8 | 4 | 2 |
+------------+---------------------+---------------------+
4 rows returned
SQL> select avg(cast(time as float from (select time, row_number over as rowNo from x) as foo group by floor(rowNo/2)
+-----------------------+
| 1 |
+-----------------------+
| 2,00000000000000E+000 |
| 5,50000000000000E+000 |
| 8,00000000000000E+000 |
+-----------------------+
3 rows returned

в AVG cast стоит, чтобы результат был float, а не INTEGER

kruzer25

А откуда эта функция берётся?
В мануале mysql ничего такого не нашёл.

zya369

я же сказал - взять что-нить БД-specific и юзать...
Неужто в мускуле, где есть куча всякой херни на все случаи жизни, нет способа узнать номер строки в результате?
Оставить комментарий
Имя или ник:
Комментарий: