Использование группировки по и объединения для создания сводок по периодам - PullRequest
0 голосов
/ 18 октября 2018

В моей базе данных есть таблица (SQL Server 2016), в которой содержится ошибка измерения для процесса, который я запускаю.Образцы берутся с 10-минутными интервалами, поэтому данные выглядят примерно так:

Timestamp                  Error

'18 Oct 2019 14:00:00',    0.200
'18 Oct 2019 14:10:00',  - 0.175
'18 Oct 2019 14:20:00',  - 0.150
'18 Oct 2019 14:30:00',    0.183

Я могу легко использовать группирование с помощью свертки для суммирования этих данных по месяцам, неделям, дням и т. Д. Но при этом я будуполучить сводку по всем дням, неделям, месяцам.

Как мне написать свой запрос для отображения сводок "К дате", т. е.

Average Error Over Period   Error

Today                        0.175
This Week                   -0.002
This Month                   0.201
This Year                    0.053
All Time                     0.027

Запрос для вычисления ошибок довольно тяжелыйтак что я бы предпочел не запускать его несколько раз

1 Ответ

0 голосов
/ 18 октября 2018

Обычно я делаю это в виде отдельных столбцов:

select avg(error) as total,
       avg(case when timestamp > cast(getdate() as date) then error end) as today,
       avg(case when timestamp > dateadd(day, -6, cast(getdate() as date) then error end) as this_week,
       . . .
from t;

Я не уверен, каковы ваши точные определения для «сегодня», «на этой неделе» и так далее.Выше приведен пример условной агрегации.

Это происходит через t только один раз.

Если вы хотите сделать это в отдельных строках, вы можете отменить вывод данных.Мой предпочтительный метод использует cross apply:

with t as (
      select avg(error) as total,
             avg(case when timestamp > cast(getdate() as date) then error end) as today,
             avg(case when timestamp > dateadd(day, -6, cast(getdate() as date) then error end) as this_week,
           . . .
      from t
     )
select v.*
from t cross apply
     (values ('Total', total), ('Today', today), ('This week', this_week), . . .
     ) v(period, error);
...