2017-10-17 101 views
-1

我被困在一个点上,我必须从客户表中选择具有customer_id和amount_paid值的数据。我想在表单中显示一个结果,即用户的前三个值应该在列名称组中显示为文本Group1和该用户的4到10个值以获取文本Group2和其余组Group3。在表上汇总查询?

你能告诉我如何为每个客户分组值吗?

感谢

回答

2

我想表明的形式的结果是用户的第一3个值应在列名组为文本Group1和用户的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 /下面的虚拟再现而生成的数据

#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

非常感谢米哈伊尔:) – Mahesh

+0

嵌套查询会很好 - 我没有看到在一次运行中的所有必要性。这当然是性感的,但更多的错误和难以维护。感觉良好的嵌套查询 - 只是试着让我们知道如果仍然需要帮助,将需要:0) –

+0

嗨米哈伊尔,我试过了,但我没有得到成功。你会指导我如何解决这个问题? – Mahesh