2017-02-21 8 views
0

Hier ist eine SQL-Abfrage (in der Umwelt Google BigQuery einen ihrer Demo-Datensätze verwenden, aber dies ist eine Standard-SQL-Frage):Mit Rang() in SQL-Gruppen Rang

SELECT name, sum(number) as namecount, RANK(name) 
OVER (ORDER BY decade, namecount DESC) as PLACEMENT, 

case 
when year >= 1940 and year <= 1949 then '40s' 
when year >= 1950 and year <= 1959 then '50s' 
when year >= 1960 and year <= 1969 then '60s' 
when year >= 1970 and year <= 1979 then '70s' 
when year >= 1980 and year <= 1989 then '80s' 
when year >= 1990 and year <= 1999 then '90s' 
when year >= 2000 and year <= 2014 then 'Nowish' 
else 
    'other' 
end as DECADE 

FROM [bigquery-public-data:usa_names.usa_1910_2013] 
where gender = 'F' and year > 1939 
group by decade, name 
having namecount > 25000 
order by decade, namecount DESC 

limit 1000000 

Lasst sie sagen, ich bin interessiert an den Rang für Linda für jedes Jahrzehnt zu wissen. Daher möchte ich, dass die Abfrage mir sagt, dass Linda in den 1940er Jahren den 2. Platz belegt und Linda in den 1950er Jahren den 2. Platz belegt. Allerdings ist die Rangordnung in der gegebenen Abfrage absolut, somit ist Linda in den 1950er Jahren der 118. (Mary ist in den 1950er Jahren der Führer an 117. Stelle).

Ein Ausschnitt aus der Ergebnismenge:

name namecount Placement Decade 

Mary 639971  1  40s 
Linda 531587  2  40s 
[ ... ] 
Mary 625464 117  50s 
Linda 564204 118  50s 

Wie der Rang zurückgesetzt, so dass Maria als # 1 für die 1950er Jahre zeigt und Linda zeigt mich als # 2 und die Reihen in einem ähnlichen zurücksetzen Art für jedes nachfolgende Jahrzehnt?

+0

SQL Server <> Big Abfrage –

Antwort

1

Mihai Antwort ist fast richtig.

SELECT name, sum(number) as namecount, RANK(name) 
OVER (PARTITION BY decade ORDER BY namecount DESC) as PLACEMENT, 
.... 

Ich vermute, dass es funktionieren würde, aber Bestellung durch Spalten in den Partitionierungskriterien ist überflüssig.

Als eine Nebenbemerkung, die der Hauptgrund für diesen Beitrag ist, ist, dass die order by namecount ist nicht etwas, was ich erwarten würde, in den meisten relationalen Datenbanken zu arbeiten, weil es das Ergebnis eines Aggregats selbst ist. Es ist also gut für Ihren Fall, dass Ihre Datenbank dies unterstützt, aber zählen Sie nicht anderswo darauf.

+0

Danke. Dies gab mir eine Platzierung von 1 für jede Zeile, aber es gab mir die Syntax, um zu dem zu kommen, was ich brauchte: SELECT Name, Summe (Zahl) als Name, RANK (Name) OVER (PARTITION BY Dekade Order by Namecount DESC) als PLACEMENT, –

+0

ja, tut mir leid. Natürlich sollte der Name nicht Teil der Partitionskriterien sein. :-P –

+0

repariert es. Ich bin immer noch überrascht, dass SQL Server Sie Aggregate im Fenster verweisen kann :-) –

1

Partition es auch in der RANK-Klausel

SELECT name, sum(number) as namecount, RANK(name) 
OVER (PARTITION BY decade, name ORDER BY decade, namecount DESC) as PLACEMENT, 
....