Sql 如何在BigQuery中使用滞后和过度来计算周移动平均线的百分比变化?

Sql 如何在BigQuery中使用滞后和过度来计算周移动平均线的百分比变化?,sql,google-bigquery,window-functions,Sql,Google Bigquery,Window Functions,我正在做一个项目。数据如下所示: 我正在尝试创建一个查询,该查询为我提供按县划分的7天新冠病毒病例数据的上下变化百分比。最终结果将是新冠病毒病例七天移动平均数的县、日期和百分比变化。最终,这将使我能够展示哪些病例相对稳定,哪些病例在增加,也就是热点 我对滞后和过度工作还不熟悉。所以我很确定我的CTE中缺少了一些基本的order by或group by 这很奇怪,因为当我只选择一个County_name=“X”所在的县时,我能够得到7天移动平均值——它只是给了我一个很好的百分比,告诉我它是增加还

我正在做一个项目。数据如下所示:

我正在尝试创建一个查询,该查询为我提供按县划分的7天新冠病毒病例数据的上下变化百分比。最终结果将是新冠病毒病例七天移动平均数的县、日期和百分比变化。最终,这将使我能够展示哪些病例相对稳定,哪些病例在增加,也就是热点

我对滞后和过度工作还不熟悉。所以我很确定我的CTE中缺少了一些基本的order by或group by

这很奇怪,因为当我只选择一个County_name=“X”所在的县时,我能够得到7天移动平均值——它只是给了我一个很好的百分比,告诉我它是增加还是减少。问题是,当我不只是选择一个县时,我就无法弄清楚我需要做什么,或者我需要改变什么才能得到相同的值。我最终得到的价值观毫无意义。我很确定这是因为我只是用错了窗口函数

这是我的密码:

具有 a选择长。*, 随着死亡人数的增加,死亡人数超过订单日期, 确认病例-随着病例的增加,确认病例比订单日期晚, 从“bigquery公共数据.covid19_usafacts.summary”开始,尽可能长 其中日期>=将“2020-05-03”转换为日期 ,b as 选择 a、 *, AVGa.Deathers_将前6行和当前行之间的超额订单增加a.date行,即7天平均死亡, AVGa.cases\u将前6行和当前行之间的超额订单增加a.date行,作为7天的平均订单 从 按a.country\u名称排序 选择 b、 县名, b、 县fips代码, b、 确诊病例, b、 案件数量增加, b、 死亡, b、 国家,, b、 平均7天, b、 日期, b、 七天平均案例-延迟b.七天平均案例超过订单b.日期/b.七天平均案例*100作为七天变化百分比 从b 其中七天平均值>0 按日期说明订购
您需要按以下方式添加分区:lagover partition by countyName order by date。指定了partition by之后,您将按日期在该countyName上排序。

您需要按:lagover partition by countyName order by date添加分区。指定了分区后,您将在该countyName上按日期排序。

下面是BigQuery标准SQL

您应该添加分区的县_名称到所有。。。查询中的语句

之后,您的查询可以如下所示

#standardSQL
WITH a AS (
  SELECT long.*,
    deaths-lag(deaths) OVER(PARTITION BY county_name ORDER BY DATE) AS deaths_increase,
    confirmed_cases - LAG(confirmed_cases) OVER (PARTITION BY county_name ORDER BY DATE) AS cases_increase,
  FROM `bigquery-public-data.covid19_usafacts.summary` AS long
  WHERE DATE >= CAST('2020-05-03' AS DATE)
), b AS (
  SELECT a.*,
    AVG(a.deaths_increase) OVER(PARTITION BY county_name ORDER BY a.date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS seven_day_avg_deaths,
    AVG(a.cases_increase) OVER(PARTITION BY county_name ORDER BY a.date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS seven_day_avg_cases
  FROM a
)
SELECT 
  b.county_name, 
  b.county_fips_code,
  b.confirmed_cases,
  b.cases_increase,
  b.deaths,
  b.state,
  b.seven_day_avg_cases,
  b.date,
  (b.seven_day_avg_cases - LAG(b.seven_day_avg_cases) OVER(PARTITION BY county_name ORDER BY b.date)) / b.seven_day_avg_cases * 100 AS seven_day_percent_change
FROM b
WHERE seven_day_avg_cases > 0
ORDER BY DATE DESC, county_name    
注意:显然,假设您的原始查询确实适用于一个国家


您查询中的另一个弱点是ORDER BY a.date行位于前6行和当前行之间-这将设置7个连续行的窗口,而不是天数,这意味着只有在统计数据中包含所有天数时,此窗口才有效-这很可能是此数据的情况。但更合适的用法是使用ORDER BY UNIX_DATEa.date范围在前6行和当前行之间-这保证您使用7天的窗口,即使某些天因任何原因丢失或过滤掉,等等。

下面是针对BigQuery标准SQL的

您应该添加分区的县_名称到所有。。。查询中的语句

之后,您的查询可以如下所示

#standardSQL
WITH a AS (
  SELECT long.*,
    deaths-lag(deaths) OVER(PARTITION BY county_name ORDER BY DATE) AS deaths_increase,
    confirmed_cases - LAG(confirmed_cases) OVER (PARTITION BY county_name ORDER BY DATE) AS cases_increase,
  FROM `bigquery-public-data.covid19_usafacts.summary` AS long
  WHERE DATE >= CAST('2020-05-03' AS DATE)
), b AS (
  SELECT a.*,
    AVG(a.deaths_increase) OVER(PARTITION BY county_name ORDER BY a.date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS seven_day_avg_deaths,
    AVG(a.cases_increase) OVER(PARTITION BY county_name ORDER BY a.date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS seven_day_avg_cases
  FROM a
)
SELECT 
  b.county_name, 
  b.county_fips_code,
  b.confirmed_cases,
  b.cases_increase,
  b.deaths,
  b.state,
  b.seven_day_avg_cases,
  b.date,
  (b.seven_day_avg_cases - LAG(b.seven_day_avg_cases) OVER(PARTITION BY county_name ORDER BY b.date)) / b.seven_day_avg_cases * 100 AS seven_day_percent_change
FROM b
WHERE seven_day_avg_cases > 0
ORDER BY DATE DESC, county_name    
注意:显然,假设您的原始查询确实适用于一个国家


您查询中的另一个弱点是ORDER BY a.date行位于前6行和当前行之间-这将设置7个连续行的窗口,而不是天数,这意味着只有在统计数据中包含所有天数时,此窗口才有效-这很可能是此数据的情况。但更合适的用法是使用ORDER BY UNIX_DATEa.date范围在前6行和当前行之间-这保证您可以使用7天的windows,即使某些天因任何原因丢失或过滤掉,等等。

感谢您的帮助和有关UNIX_date的提示。我会进一步调查的。谢谢你的帮助和关于unix_date的提示。我将对此进行更多的调查。