1

我的表如下所示:

Metro_region、价值、日期

在 11 月份具有多个值(每个日期一个)。大约有100个都会区。

我希望我的报告包含以下数据:

Metro_region  Today  Yesterday  2daysAgo  3dayAgo
MetroRegionA   40.1    54.3       64.8     48.1
MetroRegionB   31.1    53.1       97.8     43.2

我尝试了什么:

select 
  metro_region, 
  date,
  LAG(value,3) over (Partition by metro order by metro) as "3daysAgo", 
  LAG(value,2) over (Partition by metro order by metro) as "2daysAgo", 
  LAG(value,1) over (Partition by metro order by metro) as "Yesterday", 
  value as Today
from mytable 
where date = curdate();

我怀疑我没有正确分区......或者只是严重错过了如何使用LAG......任何见解都值得赞赏!

4

1 回答 1

1

您需要今天和过去 3 天的结果,因此您不能只过滤今天。
先得到4天的结果,然后过滤到今天。
此外,在每个分区中,您必须按date而不是排序metro

select metro_region, date, `3daysAgo`, `2daysAgo`, `Yesterday`, Today
from (
  select metro_region, 
         date, 
         LAG(value,3) over (partition by metro_region order by date) as `3daysAgo`, 
         LAG(value,2) over (partition by metro_region order by date) as `2daysAgo`, 
         LAG(value,1) over (partition by metro_region order by date) as `Yesterday`, 
         value as Today 
  from mytable 
  where date between curdate() - interval 3 day and curdate()
) t
where date = curdate()

查看简化的演示

于 2020-11-26T15:13:16.217 回答