2016-07-11 20 views
3

Google BigQueryで指定した範囲内のすべての日付の表を簡単に取り込む方法はありますか?すなわち、Google BigQueryで指定された範囲内のすべての日付の表を埋め込む

+------------+ 
| date  | 
+------------+ 
| 2015-06-01 | 
| 2015-06-02 | 
| 2015-06-03 | 
| ...  | 
| 2016-07-11 | 
+------------+ 

最適には、次のステップは、2つの日付の間のすべての週を取得するには、次のようになります:私は必要なものCURRENT_DATE()まで2015年6月1日からすべての日付があるので、このようなものは

+---------+ 
| week | 
+---------+ 
| 2015-23 | 
| 2015-24 | 
| 2015-25 | 
| ...  | 
| 2016-28 | 
+---------+ 

私が見つけた以下の回答では苦労していましたが、主に機能がサポートされていないため、それらを取り替える適切な方法が見つからないことが原因です。

Easiest way to populate a temp table with dates between and including 2 date parameters

Generate Dates between date ranges

あなたのヘルプは非常に高く評価されます!

ベスト、 最大2つの日付の間CURRENT_DATEまで2015年6月1日から

答えて

3

のすべての日付()

SELECT DATE(DATE_ADD(TIMESTAMP("2015-06-01"), pos - 1, "DAY")) AS DAY 
FROM (
    SELECT ROW_NUMBER() OVER() AS pos, * 
    FROM (FLATTEN((
    SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(CURRENT_DATE()), TIMESTAMP("2015-06-01")), '.'),'') AS h 
    FROM (SELECT NULL)),h 
))) 

すべての週間

SELECT YEAR(DAY) AS y, WEEK(DAY) AS w 
FROM (
    SELECT DATE(DATE_ADD(TIMESTAMP("2015-06-01"), pos - 1, "DAY")) AS DAY 
    FROM (
     SELECT ROW_NUMBER() OVER() AS pos, * 
     FROM (FLATTEN((
     SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(CURRENT_DATE()), TIMESTAMP("2015-06-01")), '.'),'') AS h 
     FROM (SELECT NULL)),h 
))) 
) 
GROUP BY y, w 
+0

恐ろしいを使用することができます!どうもありがとう :) – Max

1

Mikhailの答えは、BigQueryの従来のSQL構文では完全に機能します。このソリューションは、標準のSQL構文を使用している方がやや簡単です。

BigQueryの標準SQL構文には、実際には日付範囲から配列を作成するための組み込み関数GENERATE_DATE_ARRAYがあります。開始日、終了日、INTERVALが必要です。たとえば、次のように

SELECT day 
FROM UNNEST(
    GENERATE_DATE_ARRAY(DATE('2015-06-01'), CURRENT_DATE(), INTERVAL 1 DAY) 
) AS day 

あなたは週と年を望んでいた場合は、

SELECT EXTRACT(YEAR FROM day), EXTRACT(WEEK FROM day) 
FROM UNNEST(
    GENERATE_DATE_ARRAY(DATE('2015-06-01'), CURRENT_DATE(), INTERVAL 1 WEEK) 
) AS day 
関連する問題