在最后一行之外使用 Lag Function

Posted

技术标签:

【中文标题】在最后一行之外使用 Lag Function【英文标题】:Using Lag Function at the exception of the last row 【发布时间】:2020-01-20 00:42:10 【问题描述】:

我想获得 7 天前 last_value 和 last_value 之间的百分比差异。 这就是我现在正在做的方式,但希望有任何其他建议或替代方案:

示例 这个

日期----用户数

01/01:5005

01/02 : 6555

...

current_date-7: 5553 ...

当前日期: 6000

我正在尝试比较 6000 和 5553。我正确的做法是:

select 
 date,
 case 
   when date=current_date then number_of_users
   else lag(number_of_users,7) over(order by date) end as lag_7_day
from 
 my_table

如果你们有任何替代方案,请告诉我?谢谢!

【问题讨论】:

嗨,这是关于 mysql 还是 Redshift?它们是不同的数据库系统,因此您的问题只能用您正在使用的系统进行标记。 我迷路了。您的查询与计算百分比差异的问题有什么关系? 如果您保证每个日期有严格的一条记录并且严格没有间隔,那么您可以使用SELECT date, value, LAG(value, 7) OVER (order by date)。如果按日期存在间隙或重复,您可以使用由t1.date = t2.date + INTERVAL 7 day 连接的 2 个表格副本(如果 t2 中存在该值的间隙,您将获得 NULL,对于重复,您可能会采用一些特定的值,例如例如,MAX()) 或相关查询(如果不存在,您可以在其中近似值)。 我不清楚您的要求 - 您是希望输出中的 1 行包含最后一行和 7 天前的行,还是希望所有行都包含 7 天前的行?跨度> 【参考方案1】:

要将今天与 7 天前进行比较并获得百分比,您需要这样的东西

select 
 date,
 number_of_users as number_of_users_current_date,
 lag(number_of_users,7) over(order by date) number_of_users_lag_7_day
 (number_of_users::float -  lag(number_of_users::float,7) over(order by date)) / number_of_users::float as percent_increase
from 
 my_table
where date - current_date()

【讨论】:

以上是关于在最后一行之外使用 Lag Function的主要内容,如果未能解决你的问题,请参考以下文章

如何在 oracle pl sql 中使用 LAG 函数,直到到达非零或最后一行?

在 SQL Server 中使用上一行和下一行值 (LAG & LEAD) 计算总结束数量

Pandas 检查最后 N 行的值,基于结果的新列

如何在除最后一行之外的每一行末尾添加逗号?

MySQL lag() 具有默认值的前一行值

输入文本的最后一行延伸到 UIScrollView 之外