2017-05-19 23 views
0

bigqueryには次のトランザクションが格納されています。bigqueryまたはsqlで購入した顧客と複数の顧客との取引日ギャップの平均を求める

CUSID PID TID YYYYMMDD 
A01  P01 001 2017-01-01 
A02  P01 002 2017-02-25 
A02  P02 002 2017-02-25 
A03  P02 003 2017-03-01 
A03  P02 004 2017-03-05 
A03  P02 004 2017-03-05 
A04  P01 005 2017-03-10 
A04  P03 005 2017-03-10 
A04  P03 006 2017-03-11 
A04  P03 007 2017-03-15 

私は次のように与えられた製品のための2つのことを見つけるしたいと思います:

1)X:総顧客数と

2で割っ購入した顧客の数)Y:

したがって、すべての顧客の購買の平均日のギャップは、予想される出力は、次の表

CUSID PID TID YYYYMMDD  X    Y 
A01 P01 001 2017-01-01 3/4 = 0.75 AVG(0,0,0) = N/A (P01 does not have re-purchasing by A01, A02, and A04) 
A02 P01 002 2017-02-25 3/4 = 0.50 AVG(0,0,0) = N/A (P01 is not re-purchased by A01, A02, and A04) 
A02 P02 002 2017-02-25 2/4 = 0.50 AVG(0,4) = 4 (P02 is not re-purchased by A02 but it is re-purchased by A03 for 4 days. Note: duplicated product in the same TID is excluded, e.g. TID = 004) 
A03 P02 003 2017-03-01 2/4 = 0.50 AVG(0,4) = 4 (P02 is not re-purchased by A02 but it is re-purchased by A03 for 4 days. Note: duplicated product in the same TID is excluded, e.g. TID = 004) 
A03 P02 004 2017-03-05 2/4 = 0.50 AVG(0,4) = 4 (P02 is not re-purchased by A02 but it is re-purchased by A03 for 4 days. Note: duplicated product in the same TID is excluded, e.g. TID = 004) 
A03 P02 004 2017-03-05 2/4 = 0.50 AVG(0,4) = 4 (P02 is not re-purchased by A02 but it is re-purchased by A03 for 4 days. Note: duplicated product in the same TID is excluded, e.g. TID = 004) 
A04 P01 005 2017-03-10 3/4 = 0.75 AVG(0,0,0) = N/A (P01 is not re-purchased by A01, A02, and A04) 
A04 P03 005 2017-03-10 1/4 = 0.25 AVG(1,4) = 2.5 (P03 is repurchased by A04 for 1 and 4 day gaps) 
A04 P03 006 2017-03-11 1/4 = 0.25 AVG(1,4) = 2.5 (P03 is repurchased by A04 for 1 and 4 day gaps) 
A04 P03 007 2017-03-15 1/4 = 0.25 AVG(1,4) = 2.5 (P03 is repurchased by A04 for 1 and 4 day gaps) 
です

あなたの提案はありますか?以下は

+0

テーブルに購入した顧客と購入していない顧客の違いは何ですか? –

+0

私はその製品がどれくらい顧客に人気があるかを観察したいと思います。したがって、購入した顧客は、その製品を採用するすべての顧客であり、購入していない顧客は、その製品を採用していない顧客です。製品P01は3人の顧客A01、A02、およびA04によって購入されたが、A03は依然としてそれを購入していない。 –

+0

少なくともすべての顧客のテーブルが必要です。 –

答えて

2

私はとして使用(予想通りBigQueryの標準SQL

#standardSQL 
WITH data AS (
    SELECT 'A01' AS CUSID, 'P01' AS PID, '001' AS TID, DATE '2017-01-01' AS YYYYMMDD UNION ALL 
    SELECT 'A02', 'P01', '002', DATE '2017-02-25' UNION ALL SELECT 'A02', 'P02', '002', DATE '2017-02-25' UNION ALL SELECT 'A03', 'P02', '003', DATE '2017-03-01' UNION ALL SELECT 'A03', 'P02', '004', DATE '2017-03-05' UNION ALL 
    SELECT 'A03', 'P02', '004', DATE '2017-03-05' UNION ALL SELECT 'A04', 'P01', '005', DATE '2017-03-10' UNION ALL SELECT 'A04', 'P03', '005', DATE '2017-03-10' UNION ALL SELECT 'A04', 'P03', '006', DATE '2017-03-11' UNION ALL 
    SELECT 'A04', 'P03', '007', DATE '2017-03-15' 
), 
popularity AS (
    SELECT DISTINCT PID, 
    COUNT(DISTINCT CUSID) OVER(PARTITION BY PID)/COUNT(DISTINCT CUSID) OVER() AS X 
    FROM data 
), 
gaps AS (
    SELECT CUSID, PID, TID, YYYYMMDD, 
    DATE_DIFF(YYYYMMDD, LAG(YYYYMMDD) OVER(PARTITION BY CUSID, PID ORDER BY YYYYMMDD), DAY) AS gap 
    FROM data 
), 
gaps_without_dups AS (
    SELECT CUSID, PID, YYYYMMDD, 
    MAX(IFNULL(gap, 0)) AS gap 
    FROM gaps 
    GROUP BY CUSID, PID, YYYYMMDD 
    HAVING gap > 0 
), 
average_gaps AS (
    SELECT PID, AVG(gap) AS Y 
    FROM gaps_without_dups 
    GROUP BY PID 
) 
SELECT CUSID, PID, TID, YYYYMMDD, X, Y 
FROM data 
LEFT JOIN popularity USING (PID) 
LEFT JOIN average_gaps USING(PID) 
-- ORDER BY TID, PID 

出力は、このクエリは、同様のトリックを行う可能性があります

CUSID PID TID YYYYMMDD X  Y  
A01  P01 001 2017-01-01 0.75 null  
A02  P01 002 2017-02-25 0.75 null  
A02  P02 002 2017-02-25 0.5  4.0 
A03  P02 003 2017-03-01 0.5  4.0 
A03  P02 004 2017-03-05 0.5  4.0 
A03  P02 004 2017-03-05 0.5  4.0 
A04  P01 005 2017-03-10 0.75 null  
A04  P03 005 2017-03-10 0.25 2.5 
A04  P03 006 2017-03-11 0.25 2.5 
A04  P03 007 2017-03-15 0.25 2.5 
+0

私の答えはあなたを助けた - また、それを投票することを検討してください:o) –

+0

それは完全に動作します。私はあなたに投票しました。どうもありがとうございました。 –

1

であるため、それがまさにあなたが
を説明していトランザクションidが他のものより大きい場合、その日付も大きくなると仮定します)。

があなたの入力データである3210
SELECT 
    * EXCEPT(lead_date), 
    AVG(CASE WHEN lead_date != date THEN DATE_DIFF(parse_DATE("%Y-%m-%d", lead_date), parse_DATE("%Y-%m-%d", date), DAY) END) OVER(PARTITION BY PID) Y 
FROM(
    SELECT 
    *, 
    COUNT(DISTINCT cusid) OVER(PARTITION BY PID)/COUNT(DISTINCT cusid) OVER() X, 
    LEAD(date) OVER(PARTITION BY PID, cusid ORDER BY TID) lead_date 
    FROM 
    data) 

with data as(
select 'A01' as cusid, 'P01' as PID, 1 as TID, '2017-01-01' as date union all 
select 'A02', 'P01', 2, '2017-02-25' UNION ALL 
SELECT 'A02', 'P02', 2, '2017-02-25' UNION ALL 
SELECT 'A03', 'P02', 3, '2017-03-01' UNION ALL 
SELECT 'A03', 'P02', 4, '2017-03-05' UNION ALL 
SELECT 'A03', 'P02', 4, '2017-03-05' UNION ALL 
SELECT 'A04', 'P01', 5, '2017-03-10' UNION ALL 
SELECT 'A04', 'P03', 5, '2017-03-10' UNION ALL 
SELECT 'A04', 'P03', 6, '2017-03-11' UNION ALL 
SELECT 'A04', 'P03', 7, '2017-03-15' 
) 

あなたは分析のこのタイプを実行しているときは、analytical functionsの概念を使用してください。

BigQueryのドキュメントは非常に優れており、安全に使用して、すべての情報を理解することができます。 これにより、より簡単で高速なクエリを使用して非常に複雑なクエリを実行するスキルが得られます。

関連する問題