SQL2000 - Помогите составить запрос

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Alex3122
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 10.07.2008 (Чт) 5:18

SQL2000 - Помогите составить запрос

Сообщение Alex3122 » 11.07.2008 (Пт) 6:48

Доброго времени суток.
У меня такая проблема:
Такая структура таблицы
DateAndTime ruda water dev_num
11.07.2008 8:10:08 24,08223 38,35447 4
где dev_num - номер бригады.

Данные пишутся с интервалом в 5 минут, необходимо посчитать среднее значения ruda и water за каждую смену. С дневной сменой все просто, т.к. она приходится на одно число, а вот ночная на 2.
Результат за ночную смену разбивается на 2е строки, а нужно на 1у смену 1 результат.
Использую такой запрос

Код: Выделить всё

SELECT   AVG(ruda_cur) AS ruda_cur, AVG(water) AS water, dev_num 
   FROM         (SELECT     *
                       FROM          table
                       WHERE      (DateAndTime >= CONVERT(DATETIME, '2008-07-01', 102)) AND (DateAndTime <= CONVERT(DATETIME, '2008-07-07 23:59:59', 102))) dt
WHERE     (RIGHT(DateAndTime, 8) <= CONVERT(DATETIME, '23:59:59', 102)) AND (RIGHT(DateAndTime, 8) > CONVERT(DATETIME, '19:30:00', 102)) OR (RIGHT(DateAndTime, 8) < CONVERT(DATETIME, '7:30:00', 102)) AND (RIGHT(DateAndTime, 8) >= CONVERT(DATETIME, '00:00:00', 102))
GROUP BY dev_num, DATEPART(d,DateAndTime)


Понятно, что такой запрос выведет 2 строки за ночную смену, т.к. группирую по дню, а как реализовать группировку за 2 дня?
Или я изначально иду не в том направлении?

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 11.07.2008 (Пт) 7:20

примерно так
Код: Выделить всё
select
  AVG(ruda_cur) AS ruda_cur,
  AVG(water) AS water,
  dev_num,
  case
    when dev_time between '1900-01-01 00:00:01.000' and '1900-01-01 07:29:59.000' then dev_date
    else dateadd(dd, -1, dev_date)
  end   --если смена ночная отнимаем 1 день   
from (
  select
    ruda_cur,
    water,
    dev_num,
    dateadd(dd, datediff(dd, 0, DateAndTime), 0) dev_date,         --дата записи (без времени)      
    DateAndTime - dateadd(dd, datediff(dd, 0, DateAndTime), 0) dev_time,   --время записи (без даты)
  table t) t
group by
  dev_num, 
  case
    when dev_time between '1900-01-01 00:00:01.000' and '1900-01-01 07:29:59.000' then dev_date
    else dateadd(dd, -1, dev_date)
  end   


ЗЫЖ но лучше ввести поле "идентификатор смены", и тогда не надо было бы такие исхищрения
а если dev_num уже уникален для каждой смены, то
Код: Выделить всё
select
  AVG(ruda_cur) AS ruda_cur,
  AVG(water) AS water,
  dev_num
from
  table
group by
  dev_num 


а если что-то не так, то приведите пример данных, и что должно получиться
I Have Nine Lives You Have One Only
THINK!

Alex3122
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 10.07.2008 (Чт) 5:18

Сообщение Alex3122 » 11.07.2008 (Пт) 7:31

Спасибо. Про идентификатор смены тоже думал, но софтина, которая пишет данные в БД не позволяет задавать условия, а в триггерах SQL пока ничего не понимаю. Я в этом деле еще совсем зелен...
Сейчас попробую твой код...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.07.2008 (Пт) 7:54

Во сколько начинается смена? В 7:30?
Отними от DateAndTime 07:30 и группируй по этому полю.
Lasciate ogni speranza, voi ch'entrate.

Alex3122
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 10.07.2008 (Чт) 5:18

Сообщение Alex3122 » 11.07.2008 (Пт) 8:51

В 7:30 начинается дневная смена, ночная с 19:30 по 7:30.
Я не совсем понял отнять 7:30, т.е. оставить только дату?

Info_m.be_free
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 27.02.2003 (Чт) 21:38
Откуда: Ирпень

Re: SQL2000 - Помогите составить запрос

Сообщение Info_m.be_free » 03.10.2008 (Пт) 8:54

Отнять от начала ночной смены чтоб привести к единому знаменателю. Обработка день/ночь приведена выше кейсом.

Ем вилкой...


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 4

    TopList