CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

SQL : calculer des écarts ?

LUkSo
LUkSo
Niveau 58
28 octobre 2020 à 12:16:00

Hello, j'ai cette requête

SELECT DISTINCT e.nom, rst.temps, ( SELECT MAX(sumTP) - MIN(sumTP) "Ecart entre le premier et le dernier"
                                    FROM ( SELECT idcoureur, SUM(temps) sumTP
                                           FROM resultatetape
                                           JOIN coureur ON idcoureur = dossard
                                           WHERE idcoureur
                                            NOT IN (SELECT idcoureur 
                                                    FROM resultatetape
                                                    WHERE abandon = true
                                                   ) 
                                           GROUP BY idcoureur
                                         ) req
                                   )
FROM equipe e
JOIN coureur c
ON e.idequipe = c.idequipe
JOIN resultatetape rst
ON c.dossard = rst.idcoureur
WHERE rst.idetape = '2'
ORDER BY rst.temps, e.nom;

C'est le 3e champ qui me pose problème. Là, je cherche à calculer des écarts entre différentes équipes d'une étape du Tour de France. Actuellement, j'amène l'écart entre 1er et le dernier avec MAX(sumTP) et MIN(sumTP)
Ce que j'aimerais trouver, c'est l'écart entre le 1er et le 2e, le 3e, le 4e
Genre le 2e finit à 5 secondes, le 3e à 11 secondes etc

Comment je pourrais faire ça ? MAX et MIN ne sont pas adaptés à ça :(
Merci pour une aide éventuelle :(

Message édité le 28 octobre 2020 à 12:17:02 par LUkSo
Blackamoto
Blackamoto
Niveau 16
28 octobre 2020 à 12:31:22

sql :malade:
c'est plus simple de faire ça avec pandas

LUkSo
LUkSo
Niveau 58
28 octobre 2020 à 12:32:19

Je sens que je suis pas loin
Là je calcule l'écart entre le 1er et le dernier sur toutes les étapes

Moi je veux juste l'écart du 1er par rapport à tous les autres, et juste sur l'étape 2

LUkSo
LUkSo
Niveau 58
28 octobre 2020 à 12:47:33

https://image.noelshack.com/fichiers/2020/44/3/1603884498-ecarts.png

C'est ça que j'aimerais trouver, ça concerne juste l'étape 2
J'ai déjà trouvé les 2 premiers champs, il me manque juste le 3e avec les écarts par rapport à la première équipe
Je crois que je fais fausse route en utilisant SUM :(

Message édité le 28 octobre 2020 à 12:47:46 par LUkSo
SoRoughh
SoRoughh
Niveau 26
28 octobre 2020 à 13:49:41

Déso, j'ai supprimer mon message pour le modifié :

Salut,

Bon c'est pas tres dur.

Désolé j'ai pas reproduis tes tables, j'ai été au plus simple :

Moi j'ai 2 tables comme ça :

COUREUR:
ID_COUREUR
NOM

TEMPS:
ID_TEMPS
TEMPS
ID_COUREUR

Mes données sont les suivantes :

ID_COUREUR NOM
1 ERIC
2 FABRICE
3 JULIEN

ID_TEMPS TEMPS ID_COUREUR
1 00:24:48 1
2 00:24:52 2
3 00:24:52 3

Donc le résultat attendu c'est celui-ci :

PARTICIPANT TEMPS ECART
ERIC 00:24:48 00:00:00
FABRICE 00:24:52 00:00:04
JULIEN 00:24:52 00:00:04

Bon la première étape c'est isolé le temps le plus rapide:

SELECT MIN(TEMPS) as TEMPS_FIRST FROM dbo.temps

On a :
TEMPS_FIRST
00:24:48

Maintenant on va créer un produit cartésien pour rajouter tous les participants à cette table, et que à chaque fois le TEMPS_FIRST se repete pour pas perdre l'info :

SELECT TEMPS_FIRST, TEMPS, PARTICIPANT
FROM (
SELECT MIN(TEMPS) as TEMPS_FIRST FROM dbo.temps) A,
(
SELECT NOM as PARTICIPANT, TEMPS FROM dbo.coureur A
LEFT JOIN dbo.temps B ON A.ID_COUREUR = B.ID_COUREUR) B

Enfait, j'ai créé une nouvelle requête, qui se base sur une sous requête (la première), à laquelle je rajoute une nouvelle sous requête pour créer le produit cartésien, ce qui me donne ça :

TEMPS_FIRST TEMPS PARTICIPANT
00:24:48 00:24:48 ERIC
00:24:48 00:24:52 FABRICE
00:24:48 00:24:52 JULIEN

Bon maintenant c'est plus trop dur, t'as juste à faire l'opération suivante dans ton select : TEMPS - TEMPS_FIRST, que tu peux cast en TIME pour que ça reste au format 00:00:00

SELECT PARTICIPANT, TEMPS, CAST(TEMPS-TEMPS_FIRST as TIME) as ECART FROM (
SELECT MIN(TEMPS) as TEMPS_FIRST FROM dbo.temps) A,
(
SELECT NOM as PARTICIPANT, TEMPS FROM dbo.coureur A
LEFT JOIN dbo.temps B ON A.ID_COUREUR = B.ID_COUREUR) B
ORDER BY TEMPS
Voila cette requête donne le résultat souhaité

PARTICIPANT TEMPS ECART
ERIC 00:24:48 00:00:00
FABRICE 00:24:52 00:00:04
JULIEN 00:24:52 00:00:04

LUkSo
LUkSo
Niveau 58
30 octobre 2020 à 12:05:22

Salut, merci pour ta réponse

Voilà ce que j'ai fait de mon côté

SELECT DISTINCT e.nom, rst.temps, rst.temps -( SELECT MIN(sumTP) "1er temps"
                                    FROM ( SELECT idcoureur, SUM(temps) sumTP
                                           FROM resultatetape
                                           JOIN coureur ON idcoureur = dossard
                                           WHERE idcoureur
                                            NOT IN (SELECT idcoureur 
                                                    FROM resultatetape
                                                    WHERE abandon = true
                                                   )
                                           AND resultatetape.idetape = 2
                                           GROUP BY idcoureur
                                         ) req
                                   ) "Ecart"
FROM equipe e
JOIN coureur c
ON e.idequipe = c.idequipe
JOIN resultatetape rst
ON c.dossard = rst.idcoureur
WHERE rst.idetape = '2'
ORDER BY rst.temps, e.nom;

Par contre, au niveau des temps, je n'ai pas les secondes, mais juste les heures et les minutes. Sais-tu comment je peux ajouter les secondes ?

SoRoughh
SoRoughh
Niveau 26
30 octobre 2020 à 13:31:28

Essaye de cast(ta colonne as time)

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment