在最后一行之外使用 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 函数,直到到达非零或最后一行?