2

BigQuery/SQL の移動平均に問題があります。テーブル「SCORES」があり、ユーザーを使用してデータをグループ化しながら 30 日間の移動平均を作成する必要があります。問題は、日付が連続していないことです。たとえば、ギャップがあります。初期化。

以下は私の現在のコードです:

SELECT user, date,
      AVG(score) OVER (PARTITION BY user ORDER BY date)
FROM SCORES;

その行に日付制限を追加する方法、またはこれが可能かどうかさえわかりません。

私の現在のテーブルは次のようになりますが、もちろん、より多くのユーザーがいます。

user    date    score
AA  13/02/2018  2.00
AA  15/02/2018  3.00
AA  17/02/2018  4.00
AA  01/03/2018  5.00
AA  28/03/2018  6.00

次に、これになる必要があります:

user    date    score   30D Avg
AA  13/02/2018  2.00    2.00
AA  15/02/2018  3.00    2.50
AA  17/02/2018  4.00    3.00
AA  01/03/2018  5.00    3.50
AA  28/03/2018  6.00    5.50

最後の行のどこで、日付 (最大 30D 後方) のために後方 1 つだけを測定していますが、SQL でこれを実装する方法はありますか、それともあまりにも多くを求めていますか?

4

2 に答える 2

0

以下は BigQuery 標準 SQL の場合です

#standardSQL
SELECT *,
  AVG(score) OVER (
    PARTITION BY user 
    ORDER BY UNIX_DATE(PARSE_DATE('%d/%m/%Y', date))
    RANGE BETWEEN 29 PRECEDING AND CURRENT ROW
  ) AS avg_30day 
FROM `project.dataset.scores` 

質問のダミーデータを使用して、上記でテスト/プレイできます

#standardSQL
WITH `project.dataset.scores` AS (
  SELECT 'AA' user, '13/02/2018' date, 2.00 score UNION ALL
  SELECT 'AA', '15/02/2018', 3.00 UNION ALL
  SELECT 'AA', '17/02/2018', 4.00 UNION ALL
  SELECT 'AA', '01/03/2018', 5.00 UNION ALL
  SELECT 'AA', '28/03/2018', 6.00 
)
SELECT *,
  AVG(score) OVER (
    PARTITION BY user 
    ORDER BY UNIX_DATE(PARSE_DATE('%d/%m/%Y', date))
    RANGE BETWEEN 29 PRECEDING AND CURRENT ROW
  ) AS avg_30day 
FROM `project.dataset.scores` 

結果

Row user    date        score   avg_30day    
1   AA      13/02/2018  2.0     2.0  
2   AA      15/02/2018  3.0     2.5  
3   AA      17/02/2018  4.0     3.0  
4   AA      01/03/2018  5.0     3.5  
5   AA      28/03/2018  6.0     5.5  
于 2018-09-22T15:59:10.493 に答える