簡體   English   中英

SQL優化:窗口函數生成的兩個計算字段相乘

[英]SQL Optimization: multiplication of two calculated field generated by window functions

給定兩個時間序列表tbl1(time, b_value)tbl2(time, u_value)

https://www.db-fiddle.com/f/4qkFJZLkZ3BK2tgN4ycCsj/1

假設我們要求u_value在每一天的最后一個值, b_value當天的累計總和,以及它們的乘積,即daily_u_value * b_value_cum_sum

以下查詢計算所需的輸出:

WITH cte AS (
SELECT
  t1.time,
  t1.b_value,
  t2.u_value * t1.b_value AS bu_value,
  last_value(t2.u_value) 
  OVER 
  (PARTITION BY DATE_TRUNC('DAY', t1.time) ORDER BY DATE_TRUNC('DAY', t2.time) ) AS daily_u_value
FROM stackoverflow.tbl1 t1
LEFT JOIN stackoverflow.tbl2 t2
ON 
    t1.time = t2.time
)
SELECT
    DATE_TRUNC('DAY', c.time) AS time,
    AVG(c.daily_u_value) AS daily_u_value, 
    SUM( SUM(c.b_value)) OVER (ORDER BY DATE_TRUNC('DAY', c.time) ) as b_value_cum_sum,
    AVG(c.daily_u_value) * SUM( SUM(c.b_value) ) OVER (ORDER BY DATE_TRUNC('DAY', c.time) ) as daily_u_value_mul_b_value
FROM cte c
GROUP BY 1
ORDER BY 1 DESC

我想知道我能做些什么來優化這個查詢? 是否有任何替代解決方案可以產生相同的結果?

db 文件演示
從您的查詢:執行時間:250.666 毫秒到我的查詢執行時間:205.103 毫秒
那里似乎有一些進展。 主要是減少演員的時間,因為我看到你有很多次從時間戳轉換到時間戳。 我想知道為什么不只是另一個日期列。


我首先執行我的查詢然后執行您的查詢,這意味着比較條件相當公平,因為第二次執行通常比第一次更快。


alter table tbl1 add column t1_date date;
alter table tbl2 add column t2_date date;
update tbl1 set t1_date = time::date;
update tbl2 set t2_date = time::date;

WITH cte AS (
SELECT
  t1.t1_date,
  t1.b_value,
  t2.u_value * t1.b_value AS bu_value,
  last_value(t2.u_value)
  OVER
  (PARTITION BY t1_date ORDER BY t2_date ) AS daily_u_value
FROM stackoverflow.tbl1 t1
LEFT JOIN stackoverflow.tbl2 t2
ON
    t1.time = t2.time
)
SELECT
    t1_date,
    AVG(c.daily_u_value) AS daily_u_value,
    SUM( SUM(c.b_value)) OVER (ORDER BY t1_date ) as b_value_cum_sum,
    AVG(c.daily_u_value) * SUM( SUM(c.b_value) ) OVER
        (ORDER BY t1_date ) as daily_u_value_mul_b_value
FROM cte c
GROUP BY 1
ORDER BY 1 DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM