MySQL - 防止 CTE 中的代码重复

问题描述 投票:0回答:0

希望有人能给我一些提示,以改进以下查询。有一个应用程序将消息发送到服务器并从服务器接收消息,并以一定间隔存储到数据库。现在的目标是对这些速率进行一些汇总统计,即传入和传出消息的峰值,以及传入和传出消息的正常速率。

我知道我可以使用 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

非常感谢!

mysql sql common-table-expression
© www.soinside.com 2019 - 2024. All rights reserved.