在BigQuery中,我尝试创建一行包含Sales TY(今年财务)和Sales LY的视图。 Sales LY度量应具有与以下示例相同的对应星期数TY。
我正在使用以下代码:
SUM(table_1.sales) OVER (PARTITION BY table_1.client ORDER BY table_1.fw_end_date DESC ROWS BETWEEN 53 FOLLOWING AND 53 FOLLOWING ) as SALES_LY
问题在于,有时缺少周数,这意味着窗口函数无法反映它,因为它计算的是行数,而不是实际的周数。
在下面的示例中,该财政年度第19周和第20周缺失,因此,sales_ly度量的相应结果是错误的。
是否可以通过为缺少的日期添加/合并具有NULL值的其他行来解决?
row_number client fy wofy fw_end_date year sales sales_LY
1 1111 2020 34 2020-02-23 TY 74.97971177 75.63215281
2 1111 2020 33 2020-02-16 TY 42.42109122 68.14894689
3 1111 2020 32 2020-02-09 TY 19.85037174 87.12654065
4 1111 2020 31 2020-02-02 TY 16.56226835 3.122137476
5 1111 2020 30 2020-01-26 TY 1.800185225 10.74736963
6 1111 2020 29 2020-01-19 TY 24.75012318 38.63631908
7 1111 2020 28 2020-01-12 TY 25.25663409 1.387588554
8 1111 2020 27 2020-01-05 TY 72.26309414 0.873563634
9 1111 2020 26 2019-12-29 TY 48.42015566 81.57363107
10 1111 2020 25 2019-12-22 TY 29.94857681 41.80248501
11 1111 2020 24 2019-12-15 TY 60.84110104 26.66495665
12 1111 2020 23 2019-12-08 TY 6.810985936 48.21324987
13 1111 2020 22 2019-12-01 TY 55.25000762 8.681731452
14 1111 2020 21 2019-11-24 TY 7.314435129 61.50365765
15 1111 2020 18 2019-11-03 TY 28.86674749 84.68936948 --wrong
16 1111 2020 17 2019-10-27 TY 93.06304298
17 1111 2020 16 2019-10-20 TY 31.18234699
18 1111 2020 15 2019-10-13 TY 56.40700057
19 1111 2020 14 2019-10-06 TY 70.7995385
20 1111 2020 13 2019-09-29 TY 88.80009525
21 1111 2020 12 2019-09-22 TY 75.12011037
22 1111 2020 11 2019-09-15 TY 28.54977137
23 1111 2020 10 2019-09-08 TY 38.05238915
24 1111 2020 9 2019-09-01 TY 7.256419393
25 1111 2020 8 2019-08-25 TY 32.81145188
26 1111 2020 7 2019-08-18 TY 32.04938194
27 1111 2020 6 2019-08-11 TY 53.890913
28 1111 2020 5 2019-08-04 TY 17.4527262
29 1111 2020 4 2019-07-28 TY 66.08187866
30 1111 2020 3 2019-07-21 TY 9.331124689
31 1111 2020 2 2019-07-14 TY 61.35972079
32 1111 2020 1 2019-07-07 TY 68.02729471
33 1111 2019 52 2019-06-23 LY 65.09319706
34 1111 2019 51 2019-06-16 LY 46.3647103
35 1111 2019 50 2019-06-09 LY 45.04742519
36 1111 2019 49 2019-06-02 LY 10.72003618
37 1111 2019 48 2019-05-26 LY 69.73143446
38 1111 2019 47 2019-05-19 LY 8.3106988
39 1111 2019 46 2019-05-12 LY 18.53940931
40 1111 2019 45 2019-05-05 LY 78.27473501
41 1111 2019 44 2019-04-28 LY 4.799286544
42 1111 2019 43 2019-04-21 LY 94.58933139
43 1111 2019 42 2019-04-14 LY 27.06059414
44 1111 2019 41 2019-04-07 LY 53.42375151
45 1111 2019 40 2019-03-31 LY 22.92189479
46 1111 2019 39 2019-03-24 LY 95.3449253
47 1111 2019 38 2019-03-17 LY 62.34159147
48 1111 2019 37 2019-03-10 LY 73.99278829
49 1111 2019 36 2019-03-03 LY 39.517017
50 1111 2019 35 2019-02-24 LY 50.46146309
51 1111 2019 34 2019-02-17 LY 75.63215281
52 1111 2019 33 2019-02-10 LY 68.14894689
53 1111 2019 32 2019-02-03 LY 87.12654065
54 1111 2019 31 2019-01-27 LY 3.122137476
55 1111 2019 30 2019-01-20 LY 10.74736963
56 1111 2019 29 2019-01-13 LY 38.63631908
57 1111 2019 28 2019-01-06 LY 1.387588554
58 1111 2019 27 2018-12-30 LY 0.873563634
59 1111 2019 26 2018-12-23 LY 81.57363107
60 1111 2019 25 2018-12-16 LY 41.80248501
61 1111 2019 24 2018-12-09 LY 26.66495665
62 1111 2019 23 2018-12-02 LY 48.21324987
63 1111 2019 22 2018-11-25 LY 8.681731452
64 1111 2019 21 2018-11-18 LY 61.50365765
65 1111 2019 20 2018-11-11 LY 84.68936948
答案 0 :(得分:0)
而不是跳53行,而是搜索确切的1年前日期:
WITH data AS (
SELECT *
FROM `fh-bigquery.weather_gsod.all`
WHERE date BETWEEN '2018-12-01' AND '2020-02-24'
AND name LIKE 'SAN FRANCISCO INTERNATIONAL A'
), main_query AS (
SELECT name, date, temp
, ARRAY_AGG(STRUCT(date, temp)) OVER(PARTITION BY name ORDER BY date ROWS BETWEEN 366 PRECEDING AND 310 PRECEDING ) over_array
FROM data a
)
SELECT * EXCEPT(over_array)
, (SELECT temp FROM UNNEST(over_array) WHERE date=DATE_SUB(a.date, INTERVAL 1 year)) prev_year
FROM main_query a
ORDER BY name, date DESC
我用几天来做这件事-您可以用几周来做同样的事情。
解决了几个星期:
WITH data AS (
SELECT ROUND(AVG(temp),1) temp, DATE_TRUNC(date, week) week, name
FROM `fh-bigquery.weather_gsod.all`
WHERE date BETWEEN '2018-12-01' AND '2020-02-24'
AND name LIKE 'SAN FRANCISCO INTERNATIONAL A'
GROUP BY name, week
), main_query AS (
SELECT name, week, temp
, ARRAY_AGG(STRUCT(week, temp))
OVER(PARTITION BY name ORDER BY week
ROWS BETWEEN 53 PRECEDING AND 40 PRECEDING ) over_array
FROM data a
)
SELECT * EXCEPT(over_array)
, (SELECT temp FROM UNNEST(over_array)
WHERE EXTRACT(YEAR FROM week)+1=EXTRACT(YEAR FROM a.week)
AND EXTRACT(WEEK FROM week)=EXTRACT(WEEK FROM a.week)) prev_year
FROM main_query a
ORDER BY name, week DESC