簡體   English   中英

使用 LAG 比較今天和 7 天前的數據(不是之間)

[英]using LAG to compare the data from today and 7 days ago (not between)

我目前正在嘗試比較今天和 7 天前的匯總數字(不是今天和 7 天前之間,而是簡單地比較這兩個離散日期)。 我已經有了使用很多子查詢的方法,但是性能很差,我現在正在嘗試優化。

到目前為止,這是我想出的(示例查詢,由於機密性,沒有使用真實的表名和列):

Select current_date, previous_date, current_sum, previous_sum, percentage
From   (Select date as current_date, sum(numbers) as current_sum, 
             lag (sum(numbers)) over (partition by date order by date) as previous_sum,
             (Select max(date)-7 From t1 ) as previous_date,
             (current_sum - previous_sum)*100/current_sum as percentage
        From t1 where date>=sysdate-7 group by date,previous_date)

但是我肯定做錯了,因為在 output 中,previous_sum 出現了 null,當然還有百分比。

關於我做錯了什么的任何想法? 我以前沒有使用過 LAG,所以它一定是有的。 謝謝!

使用預聚合子查詢的連接

with agg as (
select sum(numbers) as sum_numbers, date from t1 group by date
)

select curr.sum_numbers as current_sum, 
       prev.sum_numbers as prev_sum, 
       curr.date        as curr_date, 
       prev.date        as prev_date
  from agg curr
       left join agg prev on curr.date-7=prev.date 

使用滯后:

    with agg as (
    select sum(numbers) as sum_numbers, date from t1 group by date
    )

select sum_numbers       as current_sum, 
       lag(sum_numbers, 7) over(order by date)  as prev_sum,
       a.date            as curr_date,
       lag(a.date,7) over(order by date) as prev_date
  from agg a

如果您只想要 2 個日期(今天和今天 7),那么使用條件聚合和過濾器可以更簡單地完成:

select sum(case when date = trunc(sysdate) then numbers else null end) as current_sum, 
       sum(case when date = trunc(sysdate-7) then numbers else null end) as previous_sum, 
       trunc(sysdate)         as curr_date, 
       trunc(sysdate-7)       as prev_date,
       (current_sum - previous_sum)*100/current_sum as percentage
  from t1 where date = trunc(sysdate) or date = trunc(sysdate-7)

您可以使用 window(分析)函數來執行此操作,這應該是最快的方法。 您的實際聚合查詢有點不清楚,但我認為是:

select date as current_date, sum(numbers) as current_sum
from t1 
group by date;

如果您有所有日期的值,請使用:

select date as current_date, sum(numbers) as current_sum, 
       lag(sum(numbers), 7) over (order by date) as prev_7_sum
from t1 
group by date;

如果您整天都沒有數據,請使用 window 框架:

select date as current_date, sum(numbers) as current_sum, 
       max(sum(numbers), 7) over (order by date range between '7' day preceding and '7' day preceding) as prev_7_sum
from t1 
group by date;

暫無
暫無

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

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