Sql 使用LAG比较今天和7天前的数据(不在两者之间)

Sql 使用LAG比较今天和7天前的数据(不在两者之间),sql,oracle,window-functions,lag,Sql,Oracle,Window Functions,Lag,我目前正在尝试比较今天和7天前的合计数字(不是今天和7天前,而是简单地比较这两个离散的日期)。 我已经有了一种使用大量子查询的方法,但是性能很差,我现在正在尝试优化 这就是我到目前为止提出的(示例查询,由于机密性,不使用实际的表名和列): 但我肯定做错了什么,因为在输出中,前一个_和显示为空,当然还有百分比 你知道我做错了什么吗?我以前没用过LAG,所以肯定有什么问题。 谢谢 使用预聚合子查询的联接 with agg as ( select sum(numbers) as sum_numbers

我目前正在尝试比较今天和7天前的合计数字(不是今天和7天前,而是简单地比较这两个离散的日期)。 我已经有了一种使用大量子查询的方法,但是性能很差,我现在正在尝试优化

这就是我到目前为止提出的(示例查询,由于机密性,不使用实际的表名和列):

但我肯定做错了什么,因为在输出中,前一个_和显示为空,当然还有百分比

你知道我做错了什么吗?我以前没用过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
如果您只需要两个日期(今天和今天-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)

您可以使用窗口(分析)函数来实现这一点,这应该是最快的方法。您的实际聚合查询有点不清楚,但我认为:

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;
如果没有所有日期的数据,请使用窗口框架:

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;

谢谢你的询问。我尝试了条件聚合筛选器,它将为当前和上一个总和返回空值。当我用硬编码日期替换'date=sysdate-7'时,我只返回实际值。所以,它肯定与日期部分有关。有什么想法吗?再次感谢@Nellyvel日期列的类型及其包含的内容是什么?它是日期(0),看起来像这样:2019-11-01@Nellyvel在查询中的所有位置使用TRUNC(SYSDATE-7)和TRUNC(SYSDATE),而不是SYSDATE-7和SYSDATE。编辑答案我确实有所有日期的数据,但我有意只汇总今天的数字,以及7天前的数字,并进行比较。你的第二天或第三天会这样做吗?谢谢大家!@内利维尔。如果只需要当前日期,则将上面的数据用作子查询,并在外部查询中进行筛选。
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;