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 수입니다 동부 표준시/더미 아래 플레이는
을 위해 문제를 데이터
#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
출력은
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 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
고맙습니다. Mikhail :) – Mahesh
중첩 된 쿼리는 괜찮을 것입니다. 한 번에 모두 실행해야하는 필요성을 느끼지 못합니다. 그것은 섹시하지만 오류가 많고 유지하기가 어렵습니다. 중첩 된 쿼리에 대해 좋은 생각이 들었습니다. 그냥 시도해보고 도움이 필요하면 알려주세요. o) –
안녕하세요. Mikhail, 시도했지만 성공하지 못했습니다. 이 문제를 어떻게 해결할 수 있겠습니까? – Mahesh