2017-10-17 2 views
-1

Ich bin in einem Punkt fest, ich muss die Daten aus der Kundentabelle auswählen, die Werte von customer_id und amount_paid hat. Ich möchte ein Ergebnis in der Form zeigen, dass die ersten 3 Werte des Benutzers in einer Spaltennamengruppe als Text Group1 und 4 bis 10 Werte dieses Benutzers sichtbar sein sollten, um Text Group2 und Rest Group3 zu erhalten.Aggregierende Abfrage auf Tabelle?

Können Sie mir bitte sagen, wie Sie die Werte für jeden Kunden gruppieren?

Dank

Antwort

2

Ich mag ein Ergebnis in Form zeigen, dass zunächst drei Werte des Benutzers sollten in einem Spaltennamen Gruppe als Text Gruppe1 und 4 bis 10 Werte des Benutzers sichtbar seinen Text zu erhalten group2 und Ruhe Group3

ist unten für BigQuery Standard-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 

Sie können t est/spielen mit unter Dummy-Daten erzeugt

#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 

Die Ausgabe aussehen wird unter

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  
. . .  

so müssen Sie noch Anteil berechnen, die (aus Ihrer Frage und hoffentlich) nicht ein Problem für Sie

hinzugefügt Anteilsberechnung

#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

Danke viel Mikhail :) – Mahesh

+0

verschachtelte Abfrage wäre in Ordnung - ich sehe nicht eine Notwendigkeit, alles in einem Lauf zu haben. es ist natürlich sexy, aber weniger fehleranfällig und schwer zu pflegen. Fühlen Sie sich gut über verschachtelte Abfragen - versuchen Sie es einfach und lassen Sie uns wissen, ob noch Hilfe dabei benötigt wird: o) –

+0

Hallo Mikhail, ich habe versucht, aber ich bekomme keinen Erfolg. Würdest du führen, wie ich das lösen könnte? – Mahesh