2017-12-04 16 views
0

テーブルで作業するのにbigquery #standardsqlを使用しています。この表には、9月と10月に購入したユーザーのコンバージョン(1)が表示されます.10月に購入しなかったユーザーの場合は、0の行にしか表示されません。sqlでコード化された行番号

これまでのところ、 custom_coded

(case when row_number() 
    over (partition by customer_id order by purchase_date asc) = 
        count(*) over (partition by customer_id) 
      then 1 else 0 END) AS custom_coded 

のために、これは結果であり、これまで result

私はcustomer_id = 288月だけ10と彼は来月に購入していないので、custom_coded0を持っているか、ということです期待彼は月に10

を購入記録を持っているので、これは予想される結果 expected result

である彼の最新purchase_date1を持つことが期待以前にこのスレッド(Decode maximum number in rows for sql)に尋ねた私は、しかし、データセットが満足していませんでした私は以下

+0

あなたはどんな年に9月か10月をしたい、またはちょうど2017かは、あなたの質問からダミーデータを使用して、上記と遊びますか? –

+0

こんにちは@TimBiegeleisen、それは2017です。顧客は 'custom_coded'カラムに' 1'表記を得るために2ヶ月連続で購入する必要があります。 私は実際に試してみて、この1つは '' '(ケース時)PURCHASE_DATEのASCによってCUSTOMER_ID順序によって、パーティション(オーバーROW_NUMBER() = COUNT(*)を超える(CUSTOMER_IDによってパーティション) とPURCHASE_DATE <「2017から10です-01 ' then 1 else 0 END)AS custom_coded'''' – user3292755

+0

@TimBiegeleisenしかし、そのクエリは正しくありませんでした。なぜなら、ユーザが月9日に1回だけ購入すれば、彼は自然に「1」としてコード化されるからである。 '0'にする必要がある場所 – user3292755

答えて

1

を実行するつもり分析のためのアイデアは、BigQueryの標準SQL

#standardSQL 
SELECT customer_id, item_purchased, purchase_date, 
    (CASE WHEN 
    ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY purchase_date ASC) = 
     COUNT(*) OVER (PARTITION BY customer_id) 
    AND SUM(DISTINCT (CASE FORMAT_DATE('%Y%m', purchase_date) 
     WHEN '201709' THEN 1 WHEN '201710' THEN 2 ELSE 0 END)) 
     OVER(PARTITION BY customer_id) = 3 
    THEN 1 ELSE 0 
    END) AS custom_coded 
FROM `project.dataset.table` 
のためであります3210

あなたがテストすることができます/

#standardSQL 
WITH `project.dataset.table` AS (
    SELECT 288 customer_id, 'Rice' item_purchased, DATE '2017-09-02' purchase_date UNION ALL 
    SELECT 288, 'Rice', DATE '2017-09-02' UNION ALL 
    SELECT 288, 'Rice', DATE '2017-09-06' UNION ALL 
    SELECT 879, 'Plate', DATE '2017-09-01' UNION ALL 
    SELECT 879, 'Plate', DATE '2017-09-25' UNION ALL 
    SELECT 879, 'Plate', DATE '2017-10-25' UNION ALL 
    SELECT 879, 'Plate', DATE '2017-10-27' 
) 
SELECT customer_id, item_purchased, purchase_date, 
    (CASE WHEN 
    ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY purchase_date ASC) = 
     COUNT(*) OVER (PARTITION BY customer_id) 
    AND SUM(DISTINCT (CASE FORMAT_DATE('%Y%m', purchase_date) 
     WHEN '201709' THEN 1 WHEN '201710' THEN 2 ELSE 0 END)) 
     OVER(PARTITION BY customer_id) = 3 
    THEN 1 ELSE 0 
    END) AS custom_coded 
FROM `project.dataset.table` 
ORDER BY customer_id, purchase_date 

結果が

customer_id item_purchased purchase_date custom_coded  
288   Rice   2017-09-02  0  
288   Rice   2017-09-02  0  
288   Rice   2017-09-06  0  
879   Plate   2017-09-01  0  
879   Plate   2017-09-25  0  
879   Plate   2017-10-25  0  
879   Plate   2017-10-27  1  
+0

関数を指しているとダミーデータが助けになると最初のケースでANDを見逃しました! – user3292755

関連する問題