J'ai une table de base de données qui possède une pièce d'identité, nom et heure d'une personne (en millisecondes, stockées comme un int code>). Par exemple:
| id | name | totalTime | totalRank | difference |
| --- | ------ | --------- | --------- | ---------- |
| 4 | Matt | 14440 | 1 | 0 |
| 3 | Bill | 15320 | 2 | 880 |
| 1 | Bob | 16280 | 3 | 1840 |
| 10 | Alex | 16830 | 4 | 2390 |
| 2 | Andy | 17210 | 5 | 2770 |
| 7 | Angus | 17210 | 5 | 2770 |
| 9 | Jack | 17410 | 7 | 2970 |
| 5 | Steven | 17570 | 8 | 3130 |
| 6 | Tom | NULL | NULL | NULL |
| 8 | Will | NULL | NULL | NULL |
4 Réponses :
Vous pouvez utiliser un Voir le Démo . CTE code> Pour obtenir le MIN
TotalTime Code> et utilisez-le pour calculer la différence
code>:
Résultats: P> | id | name | totalTime | totalRank | difference |
| --- | ------ | --------- | --------- | ---------- |
| 4 | Matt | 14440 | 1 | 0 |
| 3 | Bill | 15320 | 2 | 880 |
| 1 | Bob | 16280 | 3 | 1840 |
| 10 | Alex | 16830 | 4 | 2390 |
| 2 | Andy | 17210 | 5 | 2770 |
| 7 | Angus | 17210 | 5 | 2770 |
| 9 | Jack | 17410 | 7 | 2970 |
| 5 | Steven | 17570 | 8 | 3130 |
| 6 | Tom | | | |
| 8 | Will | | | |
SELECT subtable.id, subtable.NAME, subtable.totalTime, subtable.diff, IF (subtable.totalTime IS NULL, NULL, subtable.rowno) as bisi FROM ( select *, ROW_NUMBER() OVER (ORDER BY totalTime desc) as rowno, totalTime - ( select min(rst.totalTime) from results rst) as diff from results) subtable;
Ajouter une fonction de fenêtre min ()
SELECT id, name, totalTime, (CASE WHEN totalTime IS NOT NULL THEN RANK() OVER ( PARTITION BY (CASE WHEN totalTime IS NOT NULL THEN 1 ELSE 0 END) ORDER BY totalTime ) END) totalRank ,totaltime - min(totaltime) over() diff FROM results ORDER BY -totalRank DESC;
La réponse de Serg est correcte. Je l'écrirais comme: Les différences sont les suivantes: p>
par code>. Vous utilisez
case code>, mais MySQL traite commodément les booléens comme "réelles" valeurs. Li>
par code> de manière plus intuitive. li>
ol> p>