Нужен хитрый запрос на sql
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)
А без поля id нельзя?
select avg(time) from x group by cast(id/10 as integer);
Что очевидно?
![](/images/graemlins/grin.gif)
Avg(записи с 1 по 10)значит, что это первые 10 записей по порядку среди отсортированных по времени. В понимании же это записи, которые имеют некоторый номер (id от одного до десяти (т.е., например, при автоматической нумерации).
и понимают условие задачи по-разномуВот и у меня возникло такое ощущение... на что я попытался указать .
ЗЫ: А почему
cast(id/10 as integer), а не
FLOOR(`id`/10)?
добавить сортировку и заменить id на какой-нить rownum (в зависимости от базы)
ЗЫ касаемо cast И floor - просто что в голову пришло, то и написал, к тому же floor'ом я не пользовался никогда
![](/images/graemlins/smile.gif)
добавить сортировку и заменить id на какой-нить rownumА можно поподробнее?
ЗЫ касаемо cast И floor - просто что в голову пришло, то и написал, к тому же floor'ом я не пользовался никогдаПросто у меня такое ощущение, что поведение cast-а может быть разное в разных услвиях... например, округлять не до ближайшего целого снизу, а просто до ближайшего целого.
А можно поподробнее?
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
В мануале mysql ничего такого не нашёл.
Неужто в мускуле, где есть куча всякой херни на все случаи жизни, нет способа узнать номер строки в результате?
Оставить комментарий
RealFikus
Добрый день!Помогите написать хитрый запрос на SQL. Есть сайт с базой MySQL, написанный на PHP. В базе есть таблица со списком значений, которые попадали туда в зависимости от времени. Нужно как бы отсортировать все записи по времени, разделить на указанное количество групп по равному количеству записей и для каждой группы вывести среднее значение.
Т.е. если в таблице 100 записей и требуется 10 групп, то в результате должен получится столбец:
Avg(записи с 1 по 10)
Avg(записи с 10 по 11)
и т.д.
Заранее благодарен за помощь.