2017-10-17 16 views
-1

私は一点で立ち往生しています。私はcustomer_idとamount_paidの値を持つcustomerテーブルからデータを選ぶ必要があります。私は、ユーザーの最初の3つの値を、そのグループのテキストGroup1と4〜10の値として列名グループに表示し、テキストGroup2とグループ3を取得するという形で結果を表示したいとします。テーブルへのクエリの集計?

お客様ごとに値をグループ化する方法を教えていただけますか?

おかげ

答えて

2

Iは、ユーザの最初の3つの値がテキストを取得するテキストグループ1とそのユーザの4〜10の値として列名のグループに表示されなければならないこと形式で結果を表示しますグループ2とグループ3休ま以下

は、BigQueryの標準SQL

#standardSQL 
SELECT 
    user_id, 
    CASE 
    WHEN pos BETWEEN 1 AND 3 THEN 1 
    WHEN pos BETWEEN 4 AND 10 THEN 2 
    ELSE 3 
    END grp, 
    SUM(amount_paid) amount_paid 
FROM (
    SELECT 
    user_id, amount_paid, 
    ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY amount_paid DESC) pos 
    FROM customer 
) 
GROUP BY user_id, grp 
-- ORDER BY user_id, grp 

あなたは、T可能ですEST /ダミーの下で遊ぶ出力は

user_id grp amount_paid 
1  1 147.0  
1  2 323.0  
1  3 879.0  
2  1 147.0  
2  2 323.0  
2  3 879.0  
. . .  

の下のようになりますので、あなたはまだあなた

のための問題ではありません(あなたの質問から、うまくいけば)のシェアを計算する必要があるデータ

#standardSQL 
WITH users AS (
    SELECT user_id FROM UNNEST(GENERATE_ARRAY(1,5)) user_id 
), 
amounts AS (
    SELECT ROUND(50 * RAND()) amount_paid FROM UNNEST(GENERATE_ARRAY(1,50)) amount_paid 
), 
customer AS (
    SELECT user_id, ROUND(amount_paid * RAND()) amount_paid 
    FROM users 
    CROSS JOIN amounts 
) 
SELECT 
    user_id, 
    CASE 
    WHEN pos BETWEEN 1 AND 3 THEN 1 
    WHEN pos BETWEEN 4 AND 10 THEN 2 
    ELSE 3 
    END grp, 
    SUM(amount_paid) amount_paid 
FROM (
    SELECT 
    user_id, amount_paid, 
    ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY amount_paid DESC) pos 
    FROM customer 
) 
GROUP BY user_id, grp 
ORDER BY user_id, grp 

を生成

添加シェア計算

#standardSQL 
WITH grps AS (
    SELECT 
    user_id, 
    CASE 
     WHEN pos BETWEEN 1 AND 3 THEN 1 
     WHEN pos BETWEEN 4 AND 10 THEN 2 
     ELSE 3 
    END grp, 
    SUM(amount_paid) amount_paid 
    FROM (
    SELECT 
     user_id, amount_paid, 
     ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY amount_paid DESC) pos 
    FROM customer 
) 
    GROUP BY user_id, grp 
) 
SELECT * , 
    ROUND(amount_paid/SUM(amount_paid) OVER(PARTITION BY user_id), 3) share 
FROM grps 
-- ORDER BY user_id, grp 
+0

ありがとうalot Mikhail :) – Mahesh

+0

ネストされたクエリはうまくいくでしょう - 私はすべてを1回実行する必要はありません。それはもちろんセクシーですが、エラーのプルーニングとメンテナンスが難しいです。ネストされたクエリについて気分が良い - ちょうど私たちに依頼してください。まだ助けが必要な場合は教えてください:o) –

+0

こんにちはミハイル、私は試みましたが、私は成功を収めていません。どうすればこの問題を解決できますか? – Mahesh