2017-06-21 2 views
0

Ich habe gesehen this question, was fast genau das ist, was ich will. Aber ich kann es nicht mit BigQuery mit Standard-SQL arbeiten, weil BQ benutzerdefinierte Variablen nicht erlaubt.Get Top N Datensätze für jede Gruppe von gruppierten Ergebnissen mit Bigquery (Standard-SQL)

Hinweis - I eine beliebige Anzahl von Gruppen, so UNION alle von ihnen nach der ersten Antwort in der verknüpften Frage ing ist nicht machbar.

Das Folgende ist das möglichst einfache Beispiel, wenn jede Lösung soll jedoch sind viele n Top-Ergebnisse zu skalieren der Lage sein, benötigen:

eine Tabelle wie die unten gegeben, mit der Person, Gruppe und Alter Spalten, Wie würden Sie die 2 ältesten Personen in jeder Gruppe bekommen? (Krawatten innerhalb Gruppen sollten nicht mehr Ergebnisse liefern, sondern geben den ersten 2 in jedem Reihenfolge)

+--------+-------+-----+ 
| Person | Group | Age | 
+--------+-------+-----+ 
| Bob | 1  | 32 | 
| Jill | 1  | 34 | 
| Shawn | 1  | 42 | 
| Jake | 2  | 29 | 
| Paul | 2  | 36 | 
| Laura | 2  | 39 | 
+--------+-------+-----+ 

Wunschergebnismenge:

+--------+-------+-----+ 
| Shawn | 1  | 42 | 
| Jill | 1  | 34 | 
| Laura | 2  | 39 | 
| Paul | 2  | 36 | 
+--------+-------+-----+ 

Eine Antwort in der verknüpften Frage erwähnt mit ROW_NUMBER, die es gibt, aber ich kann nicht herausfinden, wie Sie die Nummer für jede Gruppe neu starten.

Antwort

2

Dies ist row_number():

select t.* 
from (select t.*, 
      row_number() over (partition by group order by age desc) as seqnum 
     from t 
    ) t 
where seqnum <= 2; 

row_number() ist eine ANSI-Standard-Fensterfunktion. Es ist in den meisten Datenbanken verfügbar. Im Allgemeinen würde ich vorschlagen, dass Sie mehr nach Lösungen suchen, die Postgres anstatt MySQL verwenden, um Probleme in BQ zu lösen (wenn Sie eine BQ-Ressource selbst nicht finden können).

1

Sie können ARRAY_AGG mit einem Limit verwenden. Zum Beispiel

#standardSQL 
SELECT 
    `Group`, 
    ARRAY_AGG(STRUCT(Person, Age) 
      ORDER BY Age DESC LIMIT 2) AS oldest_people 
FROM People 
GROUP BY `Group`; 
Verwandte Themen