使用 Group By 和 Rollup 创建期间至今的汇总
Using Group By and Rollup to Create Period to Date Summaries
我的数据库 (SQL Server 2016) 中有一个 table,其中包含我正在 运行ning 的进程的测量错误。每隔 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
我可以轻松地使用 group by 和 rollup 来按月、周、日等汇总这些数据。但这样做我会得到所有天、周、月的汇总。
我将如何编写查询以显示 "To Date" 摘要,即
Average Error Over Period Error
Today 0.175
This Week -0.002
This Month 0.201
This Year 0.053
All Time 0.027
计算错误的查询相当繁重,所以我宁愿不运行它多次
通常,我会将其作为单独的列来执行:
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;
我不确定您对 "today"、"this week" 等的确切定义是什么。以上是条件聚合的例子。
这只经过 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);
我的数据库 (SQL Server 2016) 中有一个 table,其中包含我正在 运行ning 的进程的测量错误。每隔 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
我可以轻松地使用 group by 和 rollup 来按月、周、日等汇总这些数据。但这样做我会得到所有天、周、月的汇总。
我将如何编写查询以显示 "To Date" 摘要,即
Average Error Over Period Error
Today 0.175
This Week -0.002
This Month 0.201
This Year 0.053
All Time 0.027
计算错误的查询相当繁重,所以我宁愿不运行它多次
通常,我会将其作为单独的列来执行:
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;
我不确定您对 "today"、"this week" 等的确切定义是什么。以上是条件聚合的例子。
这只经过 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);