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
ありがとうalot Mikhail :) – Mahesh
ネストされたクエリはうまくいくでしょう - 私はすべてを1回実行する必要はありません。それはもちろんセクシーですが、エラーのプルーニングとメンテナンスが難しいです。ネストされたクエリについて気分が良い - ちょうど私たちに依頼してください。まだ助けが必要な場合は教えてください:o) –
こんにちはミハイル、私は試みましたが、私は成功を収めていません。どうすればこの問題を解決できますか? – Mahesh