0
votes

Calculer la différence entre la valeur min et la valeur de chaque ligne

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       |


0 commentaires

4 Réponses :


2
votes

Vous pouvez utiliser un CTE code> Pour obtenir le MIN TotalTime Code> et utilisez-le pour calculer la différence code>: xxx pré>

Voir le Démo .
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   |           |           |            |


0 commentaires

1
votes
 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;

0 commentaires

1
votes

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;


0 commentaires

1
votes

La réponse de Serg est correcte. Je l'écrirais comme: xxx

Les différences sont les suivantes:

  1. Simplifiant la partition par . Vous utilisez case , mais MySQL traite commodément les booléens comme "réelles" valeurs.
  2. exprimant la commande par de manière plus intuitive.

0 commentaires