Сложная выборка

ldar
Дата: 15.12.2012 21:22:51
К примеру имеется таблица в которую сохраняются данные с дискретностью секунда, из этой таблицы ежечасно формируются данные по id_tag в зависимости от id_func (если id_func=1 то значения суммируются, если id_func=2 то высчитывается среднее число).

Картинка с другого сайта.

Я решил данную задачу с помощью WHILE, перечислял id_func и складывал в часовую таблицу, но данная процедура получилась тяжелая, можно ли эту задачу решить без WHILE, одним запросом?
qwerty112
Дата: 15.12.2012 22:08:15
ldar
Я решил данную задачу с помощью WHILE, перечислял id_func и складывал в часовую таблицу, но данная процедура получилась тяжелая, можно ли эту задачу решить без WHILE, одним запросом?

даа какой тут WHILE ??

2-а запроса, объединённых UNION-ом, - и все дела !
ldar
Дата: 15.12.2012 22:34:44
qwerty112
ldar
Я решил данную задачу с помощью WHILE, перечислял id_func и складывал в часовую таблицу, но данная процедура получилась тяжелая, можно ли эту задачу решить без WHILE, одним запросом?

даа какой тут WHILE ??

2-а запроса, объединенных UNION-ом, - и все дела !

C UNION кстати никогда не сталкивался, это получается сколько id_func, столько и SELECTов объединенных UNION? Надо попробовать...
qwerty112
Дата: 16.12.2012 01:30:30
ldar
qwerty112
пропущено...

даа какой тут WHILE ??

2-а запроса, объединенных UNION-ом, - и все дела !

C UNION кстати никогда не сталкивался, это получается сколько id_func, столько и SELECTов объединенных UNION? Надо попробовать...

в общем случае, если каждый id_func задаёт своё агреггирование - то да, столько же
только, вот этих "агреггирований" - "не густо" :)

так, что, если, например какие-то 2-а id_func, используют для агреггирования одно и то же (SUM напримаер),
но задают какие-то свои правила этого агреггирования (например id_func=1 - только положит.знач, а id_func=2 - только отрицат.) - то для таких id_func - 2-а отдельных запроса не понадобятся - и в одном можно ...
ldar
Дата: 16.12.2012 07:58:30
Спасибо за полный ответ!
ldar
Дата: 16.12.2012 13:20:05
Еще вопрос. К примеру необходимо сформировать минутные архивы в часовые за несколько часов. Я это организовал с помощью WHILE. К начальному времени прибавляю 60 минут произвожу выборку за этот диапазон и формирую в час. И так далее...А возможно ли это организовать без WHILE,одним запросом?
Добрый Э - Эх
Дата: 16.12.2012 18:34:39
банальный group by + case / if
Добрый Э - Эх
Дата: 16.12.2012 18:57:17
ldar
Я решил данную задачу с помощью WHILE, можно ли эту задачу решить без WHILE, одним запросом?


+ < Банальная группировка + CASE
select id_func, id_tag, 
       case
         when id_func = 1 then sum(value) 
         else avg(value) 
       end as x_func
  from t
 group by id_func, id_tag;

on-line проверка на sqlfiddle.com
Добрый Э - Эх
Дата: 16.12.2012 18:58:13
Это касательно первоначальной задачи из стартового топика...
Добрый Э - Эх
Дата: 16.12.2012 18:59:54
ldar
Еще вопрос. К примеру необходимо сформировать минутные архивы в часовые за несколько часов. Я это организовал с помощью WHILE. К начальному времени прибавляю 60 минут произвожу выборку за этот диапазон и формирую в час. И так далее...А возможно ли это организовать без WHILE,одним запросом?
И тут банальная группировка. просто поле с датой-временем нужно "урезать" до порции часа. Как? Смотреть доку, раздел по дата-временным функциям...