Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

défi pour les spécialistes du SQL

3 réponses
Avatar
denis
Bonjour à tous,

je me torture l'esprit pour optimiser les temps de calculs sur une requête,
et
j'aimerais votre avis sur la question.
j'ai une table qui contient les relevés kilométriques de véhicules, et je
veux rechercher
les discontinuités :

table km_mesures :
id : clé de la table, identifiant unique du relevé
vehicule : numéro du véhicule
date_releve : date et heure du relevé
code_activite : code indiquant de qu'a fait le véhicule
kmd : kilométrage début
kmf : kilométrage fin

je cherche à faire une procédure stockée qui
me renvoie les discontinuités dans les relevés kilométriques.
enregistrement id=9898 : le 20/01 pour le véhicule 300, kmf vaut 50000
enregistrement id =9956 : le 21/01 pour le véhicule 300, kmd vaut 50010
il y a donc 10 km non justifiés, il faudrait renvoyer :

300 / 9898 / 9956 / 10

je l'ai fait à l'aide d'un recordset que je balaye dans mon code mais
la table commence à avoit plusieurs milliers d'enregistrements et cela
devinent très lent.

avez vous une idée pour accélérer le bazar ?
pensez-vous qu'en utilisant une procédure stockée avec un curseur cela ira
plus vite qu'avec mon code VB ? encore mieux, peut-on éviter le curseur ?

merci beaucoup

Denis

3 réponses

Avatar
Synopsis
Cette requete te donne pour chacun des releves,
le kilometrage de début du releve suivant : colonne kms

select
a.id
, a.vehicule
, a.date_releve
, a.code_activite
, a.kmd
, a.kmf
, (
select b.kmd
from releve b
where b.vehicule = a. vehicule
and b.date_releve (
select min(c.date_releve)
from releve as c
where c.vehicule = a.vehicule
and c.date_releve>a.date_releve
)
) as kms
from releve as a

Tu crée ta vue.

Ensuite

select *
from maVue
where kmf <> kms

Tu as obtiens l'ensemble de tes discontinuités.



"denis" a écrit dans le message de
news:%
Bonjour à tous,

je me torture l'esprit pour optimiser les temps de calculs sur une


requête,
et
j'aimerais votre avis sur la question.
j'ai une table qui contient les relevés kilométriques de véhicules, et je
veux rechercher
les discontinuités :

table km_mesures :
id : clé de la table, identifiant unique du relevé
vehicule : numéro du véhicule
date_releve : date et heure du relevé
code_activite : code indiquant de qu'a fait le véhicule
kmd : kilométrage début
kmf : kilométrage fin

je cherche à faire une procédure stockée qui
me renvoie les discontinuités dans les relevés kilométriques.
enregistrement id˜98 : le 20/01 pour le véhicule 300, kmf vaut 50000
enregistrement id ™56 : le 21/01 pour le véhicule 300, kmd vaut 50010
il y a donc 10 km non justifiés, il faudrait renvoyer :

300 / 9898 / 9956 / 10

je l'ai fait à l'aide d'un recordset que je balaye dans mon code mais
la table commence à avoit plusieurs milliers d'enregistrements et cela
devinent très lent.

avez vous une idée pour accélérer le bazar ?
pensez-vous qu'en utilisant une procédure stockée avec un curseur cela ira
plus vite qu'avec mon code VB ? encore mieux, peut-on éviter le curseur ?

merci beaucoup

Denis




Avatar
Synopsis
En créeant un index sur (vehicule, date_releve) va beaucoup aider.

"Synopsis" a écrit dans le message de
news:43fb0e44$0$18334$
Cette requete te donne pour chacun des releves,
le kilometrage de début du releve suivant : colonne kms

select
a.id
, a.vehicule
, a.date_releve
, a.code_activite
, a.kmd
, a.kmf
, (
select b.kmd
from releve b
where b.vehicule = a. vehicule
and b.date_releve > (
select min(c.date_releve)
from releve as c
where c.vehicule = a.vehicule
and c.date_releve>a.date_releve
)
) as kms
from releve as a

Tu crée ta vue.

Ensuite

select *
from maVue
where kmf <> kms

Tu as obtiens l'ensemble de tes discontinuités.



"denis" a écrit dans le message de
news:%
> Bonjour à tous,
>
> je me torture l'esprit pour optimiser les temps de calculs sur une
requête,
> et
> j'aimerais votre avis sur la question.
> j'ai une table qui contient les relevés kilométriques de véhicules, et


je
> veux rechercher
> les discontinuités :
>
> table km_mesures :
> id : clé de la table, identifiant unique du relevé
> vehicule : numéro du véhicule
> date_releve : date et heure du relevé
> code_activite : code indiquant de qu'a fait le véhicule
> kmd : kilométrage début
> kmf : kilométrage fin
>
> je cherche à faire une procédure stockée qui
> me renvoie les discontinuités dans les relevés kilométriques.
> enregistrement id˜98 : le 20/01 pour le véhicule 300, kmf vaut 50000
> enregistrement id ™56 : le 21/01 pour le véhicule 300, kmd vaut 50010
> il y a donc 10 km non justifiés, il faudrait renvoyer :
>
> 300 / 9898 / 9956 / 10
>
> je l'ai fait à l'aide d'un recordset que je balaye dans mon code mais
> la table commence à avoit plusieurs milliers d'enregistrements et cela
> devinent très lent.
>
> avez vous une idée pour accélérer le bazar ?
> pensez-vous qu'en utilisant une procédure stockée avec un curseur cela


ira
> plus vite qu'avec mon code VB ? encore mieux, peut-on éviter le curseur


?
>
> merci beaucoup
>
> Denis
>
>




Avatar
denis
"Synopsis" a écrit dans le message de news:
43fb0e44$0$18334$
Cette requete te donne pour chacun des releves,
le kilometrage de début du releve suivant : colonne kms

select
a.id
, a.vehicule
, a.date_releve
, a.code_activite
, a.kmd
, a.kmf
, (
select b.kmd
from releve b
where b.vehicule = a. vehicule
and b.date_releve > (
select min(c.date_releve)
from releve as c
where c.vehicule = a.vehicule
and c.date_releve>a.date_releve
)
) as kms
from releve as a

Tu crée ta vue.

Ensuite

select *
from maVue
where kmf <> kms

Tu as obtiens l'ensemble de tes discontinuités.




merci,

je voyais pas comment faire remonter le suivant, c'était simplement
un min...
je vais tester...

@++