SQL versucht, eine Rangliste Spalte basierend auf Altersgruppe außerhalb des Alters Spalte zu machen

also habe ich diesen tisch

CREATE TABLE RaceResult(name char, time int, age int); INSERT INTO RaceResult (name, time, age) VALUES ('Steve', '12', '33'), ('Tim', '34', '28'), ('Mark', '22', '37'), ('Tom', '21', '30'), ('Cliff', '13', '33'), ('Vini', '17', '28'), ('Matt', '10', '28'), ('Ben', '9', '29'), ('Brandon', '15', '14'); 

und ich möchte eine 4. Spalte erstellen, die es zählt sie 1. 2. 3. etc basierend auf ihrer Altersgruppe

Die Altersgruppen sind

  • 0 – 15 yrs
  • 16 – 29 yrs
  • 30+ yrs

meine ausgewählte Aussage ist bisher:

 SELECT CASE WHEN age < '16' and age > 0 THEN 'group1' WHEN age < '30' and age > 15 THEN 'group2' WHEN age > '29' THEN 'group3' ELSE 0 END as rank, * FROM RaceResult ORDER BY time 

aber anstatt der Rang-Spalte, um einfach zu sagen 'Gruppe 1, 2 oder 3' Ich möchte es wie folgt ausgeben:

  RESULTS Name Time Age Rank ===== ==== === ==== Ben 9 29 1 Matt 10 28 2 Steve 12 33 1 Cliff 13 33 2 Brandon 15 14 1 Vini 17 28 3 Tom 21 30 3 Mark 22 37 4 Tim 34 28 4 

wirklich schätzen, wenn jemand mich in die richtige Richtung zeigen könnte

Versuche dies.

 ;WITH cte AS (SELECT NAME, time, age, CASE WHEN ( age / 15 ) + 1 < 3 THEN ( age / 15 ) + 1 ELSE 3 END AS [group] FROM RaceResult) SELECT NAME,time,age, Row_number() OVER (partition BY [group] ORDER BY time ) [Rank] FROM cte ORDER BY time 

Diese Abfrage sollte tun, was Sie wollen:

 SELECT age_group.*, @num := if (@age_group = age_group, @num + 1, 1) rank, @age_group := age_group as dummy FROM ( SELECT RaceResult.*, @group := CASE WHEN age < '16' and age > 0 THEN 'group1' WHEN age < '30' and age > 15 THEN 'group2' WHEN age > '29' THEN 'group3' ELSE 0 END as age_group FROM RaceResult, (select @age_group = '', @num = 1) init ORDER BY age_group, time ) age_group 

Die Lösung basiert auf Infos von diesem Link:

http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/