2017-10-17 7 views
-1

나는 한 지점에 갇혀 있는데 customer_id 및 amount_paid 값을 가진 고객 테이블에서 데이터를 선택해야합니다. 나는 사용자의 처음 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 수입니다 동부 표준시/더미 아래 플레이는

을 위해 문제를 데이터
#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 
+0

고맙습니다. Mikhail :) – Mahesh

+0

중첩 된 쿼리는 괜찮을 것입니다. 한 번에 모두 실행해야하는 필요성을 느끼지 못합니다. 그것은 섹시하지만 오류가 많고 유지하기가 어렵습니다. 중첩 된 쿼리에 대해 좋은 생각이 들었습니다. 그냥 시도해보고 도움이 필요하면 알려주세요. o) –

+0

안녕하세요. Mikhail, 시도했지만 성공하지 못했습니다. 이 문제를 어떻게 해결할 수 있겠습니까? – Mahesh