(SQL BigQuery) 使用滞后但数据包含缺失的月份
(SQL BigQuery) Using Lag but data contains missing months
我有以下 table 月度数据。但是我们没有第三个月。
日期
频率
2021-01-01
6000
2021-02-01
4533
2021-04-01
7742
2021-05-01
1547
2021-06-01
9857
我想把上个月的频率取到下面table.
日期
频率
PREVIOUS_MONTH_FREQ
2021-01-01
6000
空
2021-02-01
4533
6000
2021-04-01
7742
空
2021-05-01
1547
7742
2021-06-01
9857
1547
我希望 PREVIOUS_MONTH_FREQ 的 2021-04-01 记录为 NULL,因为上个月没有数据。
我到目前为止...
SELECT DATE,
FREQUENCY,
LAG(FREQUENCY) OVER(ORDER BY DATE) AS PREVIOUS_MONTH_FREQ
FROM Table1
使用 CASE 表达式检查上一行是否包含上个月的数据:
SELECT DATE,
FREQUENCY,
CASE WHEN DATE_SUB(DATE, INTERVAL 1 MONTH) = LAG(DATE) OVER(ORDER BY DATE)
THEN LAG(FREQUENCY) OVER(ORDER BY DATE)
END AS PREVIOUS_MONTH_FREQ
FROM Table1
参见demo。
在 BigQuery 中,您可以使用 RANGE
window 规范。唯一的技巧是您需要一个数字而不是日期:
select t.*,
max(frequency) over (order by date_diff(date, date '2000-01-01', month)
range between 1 preceding and 1 preceding
) as prev_frequence
from t;
'2000-01-01'
是任意日期。这会将日期列转换为自该日期以来的月数。实际日期并不重要。
我有以下 table 月度数据。但是我们没有第三个月。
日期 | 频率 |
---|---|
2021-01-01 | 6000 |
2021-02-01 | 4533 |
2021-04-01 | 7742 |
2021-05-01 | 1547 |
2021-06-01 | 9857 |
我想把上个月的频率取到下面table.
日期 | 频率 | PREVIOUS_MONTH_FREQ |
---|---|---|
2021-01-01 | 6000 | 空 |
2021-02-01 | 4533 | 6000 |
2021-04-01 | 7742 | 空 |
2021-05-01 | 1547 | 7742 |
2021-06-01 | 9857 | 1547 |
我希望 PREVIOUS_MONTH_FREQ 的 2021-04-01 记录为 NULL,因为上个月没有数据。
我到目前为止...
SELECT DATE,
FREQUENCY,
LAG(FREQUENCY) OVER(ORDER BY DATE) AS PREVIOUS_MONTH_FREQ
FROM Table1
使用 CASE 表达式检查上一行是否包含上个月的数据:
SELECT DATE,
FREQUENCY,
CASE WHEN DATE_SUB(DATE, INTERVAL 1 MONTH) = LAG(DATE) OVER(ORDER BY DATE)
THEN LAG(FREQUENCY) OVER(ORDER BY DATE)
END AS PREVIOUS_MONTH_FREQ
FROM Table1
参见demo。
在 BigQuery 中,您可以使用 RANGE
window 规范。唯一的技巧是您需要一个数字而不是日期:
select t.*,
max(frequency) over (order by date_diff(date, date '2000-01-01', month)
range between 1 preceding and 1 preceding
) as prev_frequence
from t;
'2000-01-01'
是任意日期。这会将日期列转换为自该日期以来的月数。实际日期并不重要。