Nach dem Suchen und Ausprobieren vieler Beispiele, konnte ich dies nicht herausfinden. Hoffe, du kannst mir helfen.UPDATE Rang in 3 Möglichkeiten innerhalb der Gruppe
Das ist mein Tisch Test:
+-------+-----------+----------+---------+---------+-------+
|Id | Class | Score | Rank1 | Rank2 | Rank3 |
+-------+-----------+----------+---------+---------+-------+
|1 | 1 | 9 | 0 | 0 | 0 |
|2 | 1 | 9 | 0 | 0 | 0 |
|3 | 1 | 8 | 0 | 0 | 0 |
|4 | 1 | 7 | 0 | 0 | 0 |
|5 | 2 | 9 | 0 | 0 | 0 |
|6 | 2 | 8 | 0 | 0 | 0 |
|7 | 2 | 8 | 0 | 0 | 0 |
|8 | 2 | 7 | 0 | 0 | 0 |
|9 | 2 | 6 | 0 | 0 | 0 |
+-------+-----------+----------+---------+---------+-------+
Was würde Ich mag meine Tabelle Test mit 3 Arten von Rankings UPDATE:
- = Rang 1 = mit konsekutiver auf Score pro Klasse Rang Ränge (kein Doppel)
- = Rang 2 = Ranked auf Score pro Klasse mit aufeinanderfolgenden Rängen (mit Doppel)
- = Rang 3 = Ranked auf Score pro Klasse ohne aufeinanderfolgende Ränge (mit dou ble)
Z. B:
+-------+-----------+----------+---------+---------+-------+
|Id | Class | Score | Rank1 | Rank2 | Rank3 |
+-------+-----------+----------+---------+---------+-------+
|1 | 1 | 9 | 1 | 1 | 1 |
|2 | 1 | 9 | 2 | 1 | 1 |
|3 | 1 | 8 | 3 | 2 | 3 |
|4 | 1 | 7 | 4 | 3 | 4 |
|5 | 2 | 9 | 1 | 1 | 1 |
|6 | 2 | 8 | 2 | 2 | 2 |
|7 | 2 | 8 | 3 | 2 | 2 |
|8 | 2 | 7 | 4 | 3 | 4 |
|9 | 2 | 6 | 5 | 4 | 5 |
+-------+-----------+----------+---------+---------+-------+
HINWEIS: Es hat in einer UPDATE-Anweisung anwendbar.
Für 1. ich gefunden habe (aber nicht herausfinden kann, wie es ein Update zu machen):
SET @prev := null;
SET @cnt := 0;
SELECT IF(@prev <> Class, @cnt := 1, @cnt := @cnt + 1) AS Rank, @prev := Class
FROM Test
ORDER BY Class;
Für 3. ich gefunden habe (aber nicht herausfinden kann, wie man es machen ein UPDATE):
SELECT a.Id,
a.Score,
a.Class,
count(b.Score)+1 as Rank
FROM Test a left join Test b
on a.Score>b.Score and a.Class=b.Class
GROUP BY a.Id,
a.Score,
a.Class;
ich habe die Ergebnisse hinzugefügt, wenn Punkte auf Werte mit Dezimalstellen berechnet. Seltsame Rankings erscheinen:
SET @prev_class = 0,@class = 0,@prev_score = 0,@score = 0,@rank3 = 0,@count=0;
UPDATE 1i SET
Score_pq_raw_rank = (@prev_class := IFNULL(@class,0)),
Score_pq_raw_rank = (@class := Profile_id),
Score_pq_raw_rank = (@prev_score := IFNULL(@score,-1)),
Score_pq_raw_rank = (@score := Score_pq_raw),
Score_pq_raw_rank = (
CASE WHEN @prev_class != @class THEN @rank3 := 1
WHEN @prev_class = @class AND @prev_score = @score THEN @rank3
WHEN @prev_class = @class AND @prev_score != @score THEN @rank3:[email protected][email protected]
END),
Score_pq_raw_rank = (CASE WHEN @prev_class != @class THEN @count := 0
WHEN @prev_class = @class AND @prev_score = @score THEN @count := @count + 1
WHEN @prev_class = @class AND @prev_score != @score THEN @count := 0
END),
Score_pq_raw_rank = @rank3
ORDER BY Profile_id ASC, Score_pq_raw DESC, Rowresult_id ASC;
+--------------+--------------+------------+-------------------+
| Rowresult_id | Score_pq_raw | Profile_id | Score_pq_raw_rank |
+--------------+--------------+------------+-------------------+
| 1 | 3.69054000 | 1 | 1 |
| 2 | 0.10568000 | 1 | 2 |
| 3 | -2.08058000 | 1 | 3 |
| 4 | -2.07316000 | 1 | 3 |
| 5 | -2.39066000 | 1 | 3 |
| 6 | -10.23852000 | 2 | 3 |
| 7 | -8.77718000 | 2 | 2 |
| 8 | -7.38480000 | 2 | 1 |
| 9 | -13.49128000 | 2 | 4 |
| 10 | -19.36774000 | 2 | 5 |
+--------------+--------------+------------+-------------------+
Welche SQL-Anweisungen haben Sie versucht? – BLE
Normalerweise würden Sie abgeleitete Daten nicht speichern – Strawberry
Ich habe meine Frage aktualisiert – Dev