簡體   English   中英

更正 BigQuery SQL 以從以前的分區中獲取值

[英]Correct BigQuery SQL to get value from previous partition

我正在嘗試使用窗口函數從前一個分區/窗口框架(而不是從同一分區中的其他行)獲取值。 我不完全理解如何做到這一點,但嘗試了各種使用組合:

  • 分區子句,但帶有 L​​AG() 函數
  • 省略分區子句並使用 ORDER BY + RANGE 1 PRECEDING 規范

既不給我預期的結果。

由於該值屬於“月份”而不是一行,因此我的示例變得稍微復雜一些,因此我不想對該值進行任何聚合。 值得慶幸的是,BigQuery 對此有ANY_VALUE()

我的數據如下所示:

日期 月值
2022 10 2022-10-30 50
2022 10 2022-10-31 50
2022 11 2022-11-01 60
2022 11 2022-11-01 60

預期結果是:

日期 月值 上一月值
2022 10 2022-10-30 50 無效的
2022 10 2022-10-31 50 無效的
2022 11 2022-11-01 60 50
2022 11 2022-11-01 60 50

假設如果您使用 PARTITION BY 子句,則無法從不同的分區/窗口框架訪問值,我認為 RANGE 1 PRECEDING 方法的里程數最好,但挑戰是您必須按單個數字列排序 -我的理解是您對列的選擇決定了 RANGE 的含義。 我需要按“年月”排序,並將其表示為整數是很棘手的。 我嘗試使用CAST(FORMAT_DATE("%Y%m%, Date) AS INT64)但我認為問題在於它將范圍的粒度從“日期”設置為過於細化。然后我嘗試了(Year * 100) + Month (這在邏輯上等同於(CONCAT(CAST(Year AS STRING), RIGHT(CONCAT("0", CAST(Month AS STRING)), 2)) AS INT64)但這也不起作用。

ANY_VALUE(MonthlyValue) OVER (ORDER BY (`Year` * 100) + `Month` RANGE 1 PRECEDING) AS PreviousMonthlyValue

我可以想出另一種方法來實現這一點,即我加入上個月的自加入,但我想用窗口函數來實現它。

提前致謝!

考慮下面

select *,
  last_value(MonthValue) over prev_month as PreviousMonthValue
from your_table
window prev_month as (order by 12 * year + month range between 1 preceding and 1 preceding)            

如果應用於您問題中的樣本數據 - 輸出是

在此處輸入圖像描述

上面假設該月內的所有月值都與您的示例數據中的相同 - 但很可能不是這種情況,您希望該月的最后一天的值 - 所以在這種情況下使用下面

with endMonthValues as (
  select Year, Month, array_agg(MonthValue order by Date desc limit 1)[offset(0)] MonthValue
  from your_table
  group by Year, Month
)
select a.*, b.MonthValue as PreviousMonthValue
from your_table a
left join endMonthValues b
on 12 * a.year + a.month - 1 = 12 * b.year + b.month

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM