Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
I';我试着用SQL来比较三年后的一周和下一周_Sql_Database_Google Bigquery - Fatal编程技术网

I';我试着用SQL来比较三年后的一周和下一周

I';我试着用SQL来比较三年后的一周和下一周,sql,database,google-bigquery,Sql,Database,Google Bigquery,我试图计算一周和下一周之间的店铺访客差异,我使用的查询只计算同一年的几周之间的差异,而不是一年的最后一周和下一年的第一周之间的差异(2016年第53周和2017年第1周) 这是我的桌子的样子 |日期|年|周|店名|参观人数|| 有人知道我怎么能在这三年中的所有星期里提出一个查询吗 以下是我编写查询的方式: SELECT (base.Store_Visitors-lw.Store_Visitors)/lw.Store_Visitors AS VARIANCE FROM `mypro

我试图计算一周和下一周之间的店铺访客差异,我使用的查询只计算同一年的几周之间的差异,而不是一年的最后一周和下一年的第一周之间的差异(2016年第53周和2017年第1周)

这是我的桌子的样子


|日期|年|周|店名|参观人数||


有人知道我怎么能在这三年中的所有星期里提出一个查询吗

以下是我编写查询的方式:

SELECT
    (base.Store_Visitors-lw.Store_Visitors)/lw.Store_Visitors AS VARIANCE
FROM
  `myproject` base
JOIN (
  SELECT
    *, extract(WEEK FROM (DATE_ADD(DATE(TIMESTAMP(date)) , INTERVAL 1 Week))) AS n_week

  FROM
    `myproject` ) lw
ON
  base.WEEK = (lw.n_week-1)
  AND base.YEAR = lw.YEAR
  AND base.DAYOFWEEK = lw.DAYOFWEEK

  AND base.Store_Name = lw.Store_Name

您需要按周和年对数据进行行号,并加入该行或数据的其他非重复值

SELECT
    (base.Store_Visitors-lw.Store_Visitors)/lw.Store_Visitors AS VARIANCE,
    ROW_NUMBER() OVER( PARTITION BY Store_Name ORDER BY YEAR, WEEK) AS WeekOrder

FROM
  `BaseData` base
JOIN (
  SELECT
    *, extract(WEEK FROM (DATE_ADD(DATE(TIMESTAMP(date)) , INTERVAL 1 Week))) AS n_week,
   ROW_NUMBER() OVER( PARTITION BY Store_Name ORDER BY YEAR, WEEK) AS WeekOrder


  FROM
    `BaseData` ) lw
ON
  base.WeekOrder= lw.WeekOrder-1
  AND base.DAYOFWEEK = lw.DAYOFWEEK

  AND base.Store_Name = lw.Store_Name

您需要按周和年对数据进行行号,并加入该行或数据的其他非重复值

SELECT
    (base.Store_Visitors-lw.Store_Visitors)/lw.Store_Visitors AS VARIANCE,
    ROW_NUMBER() OVER( PARTITION BY Store_Name ORDER BY YEAR, WEEK) AS WeekOrder

FROM
  `BaseData` base
JOIN (
  SELECT
    *, extract(WEEK FROM (DATE_ADD(DATE(TIMESTAMP(date)) , INTERVAL 1 Week))) AS n_week,
   ROW_NUMBER() OVER( PARTITION BY Store_Name ORDER BY YEAR, WEEK) AS WeekOrder


  FROM
    `BaseData` ) lw
ON
  base.WeekOrder= lw.WeekOrder-1
  AND base.DAYOFWEEK = lw.DAYOFWEEK

  AND base.Store_Name = lw.Store_Name

下面是BigQuery标准SQL和使用分析函数而不是自连接的示例

#standardSQL
WITH temp AS (
  SELECT 
    EXTRACT(YEAR FROM t.date) year, 
    EXTRACT(WEEK FROM t.date) week, 
    Store_Name, 
    Number_Of_Vistors
  FROM `project.dataset.table` t
)
SELECT Store_Name, year, week, 
  (Number_Of_Vistors - ANY_VALUE(Number_Of_Vistors) 
    OVER(PARTITION BY Store_Name, year ORDER BY week RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING)
  ) / Number_Of_Vistors AS variance
FROM temp t   
您可以使用以下示例中的虚拟数据测试、播放上述内容

#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATE '2018-12-02' `date`, 'abc' Store_Name, 11 Number_Of_Vistors UNION ALL
  SELECT '2018-12-09', 'abc', 22 UNION ALL
  SELECT '2018-12-16', 'abc', 33 UNION ALL
  SELECT '2018-12-23', 'abc', 44 UNION ALL
  SELECT '2018-12-30', 'abc', 55 UNION ALL
  SELECT '2019-01-06', 'abc', 66 UNION ALL
  SELECT '2019-01-13', 'abc', 77 UNION ALL
  SELECT '2019-01-20', 'abc', 88 
), temp AS (
  SELECT 
    EXTRACT(YEAR FROM t.date) year, 
    EXTRACT(WEEK FROM t.date) week, 
    Store_Name, 
    Number_Of_Vistors
  FROM `project.dataset.table` t
)
SELECT Store_Name, year, week, 
  (Number_Of_Vistors - ANY_VALUE(Number_Of_Vistors) 
    OVER(PARTITION BY Store_Name, year ORDER BY week RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING)
  ) / Number_Of_Vistors AS variance
FROM temp t
ORDER BY Store_Name, year, week   
结果

Row Store_Name  year    week    variance     
1   abc         2018    48      null     
2   abc         2018    49      0.5  
3   abc         2018    50      0.3333333333333333   
4   abc         2018    51      0.25     
5   abc         2018    52      0.2  
6   abc         2019    1       null     
7   abc         2019    2       0.14285714285714285  
8   abc         2019    3       0.125     
注意:由于您的问题不清楚您的数据到底是如何表示的-我假设您每周、每年、每家商店都有一行数据


您应该能够根据实际数据类型/用例的需要调整上面的内容

下面是针对BigQuery标准SQL的,并使用分析函数而不是自连接

#standardSQL
WITH temp AS (
  SELECT 
    EXTRACT(YEAR FROM t.date) year, 
    EXTRACT(WEEK FROM t.date) week, 
    Store_Name, 
    Number_Of_Vistors
  FROM `project.dataset.table` t
)
SELECT Store_Name, year, week, 
  (Number_Of_Vistors - ANY_VALUE(Number_Of_Vistors) 
    OVER(PARTITION BY Store_Name, year ORDER BY week RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING)
  ) / Number_Of_Vistors AS variance
FROM temp t   
您可以使用以下示例中的虚拟数据测试、播放上述内容

#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATE '2018-12-02' `date`, 'abc' Store_Name, 11 Number_Of_Vistors UNION ALL
  SELECT '2018-12-09', 'abc', 22 UNION ALL
  SELECT '2018-12-16', 'abc', 33 UNION ALL
  SELECT '2018-12-23', 'abc', 44 UNION ALL
  SELECT '2018-12-30', 'abc', 55 UNION ALL
  SELECT '2019-01-06', 'abc', 66 UNION ALL
  SELECT '2019-01-13', 'abc', 77 UNION ALL
  SELECT '2019-01-20', 'abc', 88 
), temp AS (
  SELECT 
    EXTRACT(YEAR FROM t.date) year, 
    EXTRACT(WEEK FROM t.date) week, 
    Store_Name, 
    Number_Of_Vistors
  FROM `project.dataset.table` t
)
SELECT Store_Name, year, week, 
  (Number_Of_Vistors - ANY_VALUE(Number_Of_Vistors) 
    OVER(PARTITION BY Store_Name, year ORDER BY week RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING)
  ) / Number_Of_Vistors AS variance
FROM temp t
ORDER BY Store_Name, year, week   
结果

Row Store_Name  year    week    variance     
1   abc         2018    48      null     
2   abc         2018    49      0.5  
3   abc         2018    50      0.3333333333333333   
4   abc         2018    51      0.25     
5   abc         2018    52      0.2  
6   abc         2019    1       null     
7   abc         2019    2       0.14285714285714285  
8   abc         2019    3       0.125     
注意:由于您的问题不清楚您的数据到底是如何表示的-我假设您每周、每年、每家商店都有一行数据


您应该能够根据实际数据类型/用例的需要调整上述内容(1)我删除了不兼容的数据库标记。请仅使用您真正使用的数据库进行标记。(2) 示例数据和所需结果帮助。我正在Bigquery上使用标准Sql:)!哪些标签不兼容?顺便说一下,感恩节一般有52周。只有当一年的第一天是星期四,或者闰年的第一天是星期三时,它才可能有53个。@helloworld-这很重要-您可以使用投票下方张贴的答案左侧的勾号
标记接受的答案。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,你可以提高自己的声望得分,同时让我们有动力来回答你的问题:O)请考虑!(1) 我删除了不兼容的数据库标记。请仅使用您真正使用的数据库进行标记。(2) 示例数据和所需结果帮助。我正在Bigquery上使用标准Sql:)!哪些标签不兼容?顺便说一下,感恩节一般有52周。只有当一年的第一天是星期四,或者闰年的第一天是星期三时,它才可能有53个。@helloworld-这很重要-您可以使用投票下方张贴的答案左侧的勾号
标记接受的答案。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,你可以提高自己的声望得分,同时让我们有动力来回答你的问题:O)请考虑!