希望有人能给我一些提示,以改进以下查询。有一个应用程序将消息发送到服务器并从服务器接收消息,并以一定间隔存储到数据库。现在的目标是对这些速率进行一些汇总统计,即传入和传出消息的峰值,以及传入和传出消息的正常速率。
我知道我可以使用 CTE 来做到这一点,但是鉴于每个 CTE 部分只需要一个新变量,所以有很多重用代码,我真的希望可以做得更好。
WITH
daily_peak_in_stat as (
select day,
engine,
min(interval_start) as interval_start_peak_in,
max(interval_end) as interval_end_peak_in,
max_peak_incoming_msgrate
from (select day,
engine,
interval_start,
interval_end,
peak_incoming_msgrate,
max(peak_incoming_msgrate) over (partition by day, engine) as max_peak_incoming_msgrate
from daily_running_rates) t
where peak_incoming_msgrate = max_peak_incoming_msgrate
group by day, engine, max_peak_incoming_msgrate
),
daily_peak_out_stat as (
select day,
engine,
min(interval_start) as interval_start_peak_out,
max(interval_end) as interval_end_peak_out,
max_peak_outgoing_msgrate
from (select day,
engine,
interval_start,
interval_end,
peak_outgoing_msgrate,
max(peak_outgoing_msgrate) over (partition by day, engine) as max_peak_outgoing_msgrate
from daily_running_rates) t
where peak_outgoing_msgrate = max_peak_outgoing_msgrate
group by day, engine, max_peak_outgoing_msgrate
),
then the other parts to finally do a select * from all and do a join to get the final result
因为我也有进出基本速率,查询中会有几乎 4 个重复块,我主要需要将 peak_incoming_rate 更改为 peak_outgoing_rate 到 base_incoming_rate 等。
有人可以提供一些技巧来改进查询吗?我知道 CTE 不能像 JAVA 函数那样运行,我传入参数并返回字段,但应该有一些东西不会使这个如此长的重复查询。
结果模式例如如下所示:
| day | engine | interval_start_peak_in | interval_end_peak_in | peak_msgrate_in | interval_start_peak_out | interval_end_peak_out | peak_msgrate_out | etc. etc
非常感谢!