I';我试着用SQL来比较三年后的一周和下一周
我试图计算一周和下一周之间的店铺访客差异,我使用的查询只计算同一年的几周之间的差异,而不是一年的最后一周和下一年的第一周之间的差异(2016年第53周和2017年第1周) 这是我的桌子的样子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
|日期|年|周|店名|参观人数||
有人知道我怎么能在这三年中的所有星期里提出一个查询吗 以下是我编写查询的方式:
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)请考虑!