2015-11-05 2 views
0

В таблице у меня есть данные, поступающие с датчиков. Значение активности отправляется датчиком каждые 15 минут. Теперь я хочу рассчитать среднее значение этих значений 2 раза в день. Как и в случае, 1-е среднее значение дня будет средним значением с 00:00:00 до 12:00:00, а второе среднее значение за тот же день будет находиться между 12:00 и 23:59: 59.SQL Server DateTime Intervals

Мои TimeStampByNode магазинах столбцов DATETIME в формате datetime2, т.е. «2015-09-02 2:03:04»

Я использовал этот запрос, чтобы получить среднее ежедневное, то есть все 24 часа;

SELECT 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)), 
    ROUND(AVG(Value), 2) 
FROM 
    data_record2 
WHERE 
    Node_ID = 55554321 AND Value_Type = 'Activity' 
GROUP BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) 
ORDER BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) DESC 

Как изменить это, чтобы получить 2 среднесуточных значения?

ответ

1

Как насчет двух разных средних значений в день? NULL, возвращенный в случаях ELSE, гарантирует, что они не будут помещены в средние значения.

SELECT 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)), 
    -- Start -- 
    ROUND(AVG(CASE WHEN DATEPART(HH, TimeStampByNode) < 12 
      THEN Value ELSE NULL END), 2) as AVG_AM, 
    ROUND(AVG(CASE WHEN DATEPART(HH, TimeStampByNode) >= 12 
      THEN Value ELSE NULL END), 2) as AVG_PM 
    -- End -- 
FROM 
    data_record2 
WHERE 
    Node_ID = 55554321 AND Value_Type = 'Activity' 
GROUP BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) 
ORDER BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) DESC 

(Missing кронштейн отредактирован)

+0

Я получаю ошибка, указывающая «Функция AVG требует 1 аргумент (ы)». –

+0

Это неверные вычисления. Первый ответ возвращает правильные значения. Может ли это иметь какое-либо отношение к передаче нулей в сценарии, где случай не выполняется? –

+1

Ah - второе условие должно быть> = 12 – Jan

1

Вам нужно добавить следующее условие к статье GROUP BY:

... 
GROUP BY (...), case when (DATEPART(hh, TimeStampByNode) < 12) then 1 else 0 end 
... 

Так это будет:

SELECT 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)), 
    ROUND(AVG(Value), 2) 
FROM 
    data_record2 
WHERE 
    Node_ID = 55554321 AND Value_Type = 'Activity' 
GROUP BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) 
    , case when (DATEPART(hh, TimeStampByNode) < 12) then 1 else 0 end 
ORDER BY 
      DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) DESC 
+0

Спасибо! Это работает нормально. но, как я могу отличить, какое значение для какой части дня? Первое значение всегда будет для случая 1? А второй для case2? –

+0

вы можете сделать то же самое в предложении select, если необходимо: 'case when (DATEPART (hh, max (TimeStampByNode)) <12), затем« Before 12 »else« After »end« Тип интервала » – Andy

+0

Извините, didn не получим часть «Тип интервала»! –