Как правильно использовать AVG () в SQL? - PullRequest
0 голосов
/ 08 ноября 2018

Я отслеживаю производительность базовой станции в сети RF, сохраняя значения SSI в этой таблице:

TABLE BASE_SSI:
    wayside     BIGINT (PK)
    timestamp   datetime
    base        varchar(12)
    ssi         int

SSI читается один раз в час и сохраняется в этой таблице приблизительно за один год.

Я могу извлечь значения SSI за один день для любого данного дня в прошлом с помощью этого запроса:

select wayside,timestamp,base,ssi from BASE_SSI 
where wayside=225520220000 
and timestamp > DATEADD(day,-7,getdate())
and timestamp < DATEADD(day,-6,getdate())
order by timestamp desc

, который дает мне эти результаты:

wayside         timestamp             base        ssi
225520220000    2018-11-02 00:21:09   423.3.01    33
225520220000    2018-11-01 22:31:03   423.3.01    32
225520220000    2018-11-01 20:40:53   423.3.01    32
225520220000    2018-11-01 18:50:45   423.3.01    31
225520220000    2018-11-01 17:00:35   423.3.01    33
225520220000    2018-11-01 15:10:26   423.3.01    34
225520220000    2018-11-01 13:20:20   423.3.01    38
225520220000    2018-11-01 11:30:11   423.3.01    37
225520220000    2018-11-01 09:40:03   423.3.01    35
225520220000    2018-11-01 07:49:03   423.3.01    35
225520220000    2018-11-01 05:59:50   423.3.01    34
225520220000    2018-11-01 04:09:43   423.3.01    34
225520220000    2018-11-01 02:19:34   423.3.01    34

Что мне нужно, так это запрос, который дает мне СРЕДНЮЮ СИУ за этот 24-часовой период в прошлом, по всем путям. Результаты должны быть:

wayside         date         base        avg_ssi
225520220000    2018-11-01   423.3.01    34
225520230000    2018-11-01   423.2.21    21
225520240000    2018-11-01   423.4.11    18
225520250000    2018-11-01   423.1.21    55
225520260000    2018-11-01   422.2.01    62
225520270000    2018-11-01   452.3.07    33
225520280000    2018-11-01   425.1.03    25

Мне нужны только интегральные значения для средних значений ssi, как показано.

Я пытался использовать AVG (ssi) в операторе SELECT, но я не уверен, как применить это ко всем значениям обхода в выбранный период времени. Например, в исходном запросе Я добавляю «AVG (ssi) как avg_ssi» в строку SELECT, но он выдает только «средний» SSI для каждой отдельной записи, который совпадает со значением SSI.

Моя псевдо-SQL-версия этого запроса будет «отображать 24-часовой средний SSI каждого обхода на заданную дату».

1 Ответ

0 голосов
/ 08 ноября 2018

Вы можете попробовать использовать avg с group by на CONVERT(char(10), timestamp,126) пусть datetime для yyyy-MM-dd форматировать group by каждую дату.

select wayside,CONVERT(char(10), timestamp,126),base,avg(ssi) as avg_ssi
from BASE_SSI 
where timestamp > DATEADD(day,-7,getdate()) and timestamp < DATEADD(day,-6,getdate())
group by CONVERT(char(10), timestamp,126),base,wayside
order by timestamp desc

EDIT

Из вашего комментария вы можете попробовать использовать ROW_NUMBER оконную функцию, чтобы получить первый ssi по каждому base.

SELECT wayside,
       CONVERT(char(10), timestamp,126),
       base,
       ssi as avg_ssi 
FROM (
    select wayside,timestamp,base,ssi,Row_number() over(partition by base order by timestamp) rn
    from BASE_SSI 
    where timestamp > DATEADD(day,-7,getdate()) and timestamp < DATEADD(day,-6,getdate())
) t1
where rn = 1
order by timestamp desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...