Google bigquery BigQuery-将一列乘以从特定日期开始的滚动年的递减系数

Google bigquery BigQuery-将一列乘以从特定日期开始的滚动年的递减系数,google-bigquery,Google Bigquery,我的表中有两列;时间戳从2020-01-01 00:00:00开始,到2050-12-31 23:00:00结束,时间间隔为1小时,生产数据为每小时。我想将生产数据逐年降低0.5%。第一年的生产数据不会改变。在第二年,它将开始下降乘以全年相同的值 如果我想从2021-08-01 00:00:00开始对生产列应用降级,我该怎么做?例如,第一年的日期将包括2021-08-01 00:00:00和2022-07-31 23:00:00之间的日期,产量将乘以1。第二年2022-08-01 00:00:0

我的表中有两列;时间戳从2020-01-01 00:00:00开始,到2050-12-31 23:00:00结束,时间间隔为1小时,生产数据为每小时。我想将生产数据逐年降低0.5%。第一年的生产数据不会改变。在第二年,它将开始下降乘以全年相同的值


如果我想从2021-08-01 00:00:00开始对生产列应用降级,我该怎么做?例如,第一年的日期将包括2021-08-01 00:00:00和2022-07-31 23:00:00之间的日期,产量将乘以1。第二年2022-08-01 00:00:00-2023-07-31 23:00:00产量将乘以0.995。

第一年退化系数为0.995,第二年退化系数为0.995*0.995等。 您可以将问题分为两部分:

指定降级级别相同的行组g列的下方和 将生产数据乘以预计算系数。 查询:

#standardSql
with sample as (
select  timestamp '2020-01-01 00:00:00' as t, 100 as d union all
select  timestamp '2020-08-01 00:00:00', 100 union all
select  timestamp '2021-01-01 00:00:00', 100 union all
select  timestamp '2021-07-31 23:00:00', 100 union all
select  timestamp '2021-08-01 00:00:00', 100 union all
select  timestamp '2022-01-01 00:00:00', 100 union all
select  timestamp '2022-08-01 00:00:00', 100 
), partial_result as (
  select t,d, div(greatest(date_diff(cast(t as date), cast('2020-08-01' as date), month),0),12) as g from sample
)
select t,d, d*pow(0.995,g) as newd
from partial_result
newd可以在update语句中使用


注意:如果您希望对第n级的值进行舍入,并根据前一级的舍入值计算第n+1级的值,则此方法不可用。

示例输入/输出将极大地帮助我们回答您的问题。另外一个问题,您是否需要每个生产时间戳记录的未来每小时记录,或者只需要应用系数的每小时的年度记录?