代码之家  ›  专栏  ›  技术社区  ›  Richard B

使用Group By和Rollup创建期间至今摘要

  •  1
  • Richard B  · 技术社区  · 6 年前

    我的数据库(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
    

    我可以很容易地使用groupby和rollup来按月、周、日等总结这些数据,但这样做我会得到所有天、周、月的总结。

    如何编写查询以显示“截止日期”摘要,即。

    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 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    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);