IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Requête super compliquée


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Par défaut Requête super compliquée
    Bonjour à tous,

    Je viens vers vous en espérant que vous pourrez m'aider

    J'ai une base de données avec de nombreuses valeurs (plus de 100 000 oO).
    Avec une date et une valeur attitrée. Lorsque je fais mon select entre deux date, il me retourne plus de 5000 valeurs, et mon application ne le permet pas :S

    C'est pourquoi j'aimerais pouvoir récupérer par exemple 2000 valeurs, avec la première valeur correspondant à ma première date, et ma dernière valeur correspondant à ma dernière date. Entre ces deux dates, il faudrait 1998 valeurs toutes séparées avec le même interval.

    Ma table est trié par date.

    Merci d'avance pour vos nombreuses réponses.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Quelle est votre version de SQL-Server ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Par défaut
    J'ai la version express 2008.

    Merci

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Une piste de recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    With Datas (Valeur, MaDate, Grp) as
    (
    select Valeur, MaDate
         , NTILE(2000) over (order by MaDate asc)
      from MaTable
     where MaDate between <Dt1> and <Dt2>
    )
      ,  SR (Valeur, MaDate, Rn) as
    (
    select Valeur, MaDate
         , ROW_NUMBER() over(PARTITION by Grp order by N asc)
      from Datas
    )
    select Valeur, MaDate
      from SR
     where Rn = 1

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Par défaut
    Merci pour cette réponse rapide, j'essaie ça dans la journée, et je vous tiens au courant de mon avancé.

    Merci encore.

  6. #6
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Par défaut
    Bonjour je suis un ami de pedrolito.
    J'aimerais comprendre votre requete mais je ne la comprends pas. Je m'explique: nous avons une table avec une colonne date nommée date_valeurs et d'autres colonnes nommées respectivement A1, A2, A3.. et contenant des valeurs
    Ce que nous aimerions faire c'est donc prendre par exemple 2000 valeurs de A1 entre une date 1 et une date2. L'ensemble des dates doivent être séparées par un intervalles plus ou moins egales.
    J'ai donc essayé votre requetes comme cela (il se peut que j'ai mal fait la requete car je ne la comprends pas trops):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    WITH Datas (A1, date_valeurs, Grp) AS
    (
    SELECT date_valeurs, A1
    , NTILE(2000) over (ORDER BY date_valeurs ASC)
    FROM valeursMesurees
    WHERE date_valeurs BETWEEN '2012-01-11 18:49:10.000' AND '2012-01-11 18:53:50.000'
    )
    , SR (A1, date_valeurs, Rn) AS
    (
    SELECT A1, date_valeurs
    , ROW_NUMBER() over(PARTITION BY Grp ORDER BY date_valeurs ASC)
    FROM Datas
    )
    SELECT A1, date_valeurs
    FROM SR
    WHERE Rn = 1
    Merci pour votre future reponse

  7. #7
    Membre expérimenté
    Inscrit en
    Janvier 2012
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 145
    Par défaut
    Je ne sais pas à quoi ressemble l'application, mais ne serait il pas plus intéressant de présenter à l'utilisateur des pages de 1000 (ou 2000) résultats? On pourrait aussi y ajouter la date min et la date max. J'avoue avoir du mal à comprendre (mais veux bien être éclairé ) l'idée de séparer les dates par un intervalle pas très régulier...

  8. #8
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Par défaut
    Si si le mieux serait de séparer les date par un intervalle régulier.
    Au fait il s'agit de réaliser des graphiques grâce a ces données. Et le problème c'est que lorsque l'on récupére l'ensemble des données et que l'on veut les afficher sous forme de graphique, le système rame. (Cependant, pour environ 2000 valeurs tout ce passe correctement).

    Est ce que c'est plus clair?

  9. #9
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Donc ce que vous voulez, ça serait plutôt du domaine de la moyenne sur quelques intervalles prédéfinis, non ?
    Admettons qu'entre les dates limites 1er janvier 2010 et 31 décembre 2010, il y ait 2000 valeurs en janvier, puis 1000 en février, puis 2000 en décembre. Vous voudriez que ça choisisse quelles valeurs ?

    Sinon, autant prendre les 2000 premières valeurs.

  10. #10
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Par défaut
    Et bien si le graphique représente les valeurs du 1 janvier 2010 au 31 décembre 2010 nous voudrions prendre 2000 valeurs de façon a ce que le graphique représente plus ou moins la réalité (donc les 2000 premières valeurs de conviennent pas puisque dans cette exemple nous aurons que le mois de janvier). Donc ce serait 2000 valeurs séparées par un intervalle (a definir) de façon a couvrir toute la periode.

    Avez vous compris? C'est dur a expliquer

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    La fonction NTILE que j'ai utilisée scinde en votre jeu de données en 2000 groupes de tailles à peu près comparables.

    J'ai ensuite utiliser la fonction ROW_NUMBER pour récupérer le premier membre de chaque groupe.

    Il me semble que ça cadre à peu près à votre besoin, le plus simple reste de décomposer la requête et de voir pas à pas ce qu'elle fait, n'ayant pas vos données sous la main je ne peux pas garantir que ce soit la meilleure solution.

    Et puis vous êtes étudiant, c'est bien pour vous de chercher aussi !

  12. #12
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Par défaut
    Ce n'est pas faux. Je vous remercie de nous avoir repondu .
    Cependant, j'ai encore une question à propos de la requête:

    A quoi sert le WITH ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WITH Datas (A1, date_valeurs, Grp) AS
    et que signie cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    , SR (A1, date_valeurs, Rn) AS

    Je n'arrive pas a trouver une explication clair sur internet. Merci.

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    C'est ce qu'on appelle en anglais une CTE (Common Table Expression) ou expression de table commune en français.

    Ça permet de déclarer une ou plusieurs requêtes qu'on peut utiliser par la suite.

    With est le mot clef qui est associé à la CTE.
    La seconde ligne, c'est la seconde CTE de la requête.

    La requête que j'ai écrite est strictement égale à celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT Valeur, MaDate
      FROM (SELECT Valeur, MaDate
                 , ROW_NUMBER() over(PARTITION BY Grp ORDER BY N ASC) as Rn
              FROM (SELECT Valeur, MaDate
                         , NTILE(2000) over (ORDER BY MaDate ASC) as Grp
                      FROM MaTable
                     WHERE MaDate BETWEEN <Dt1> AND <Dt2>
                    ) AS Datas
            ) AS SR
     WHERE Rn = 1
    La documentation Microsoft :
    http://msdn.microsoft.com/fr-fr/library/ms190766.aspx

    Le cours de SQLPro :
    http://sqlpro.developpez.com/cours/s...cursives/#LIII

  14. #14
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Par défaut
    Merci pour vos réponses rapides.
    Je vais essayer de faire fonctionner la requête aujourd'hui ou demain et je reviendrais vers vous pour vous dire si elle fonctionne.

    Encore merci et bonne après-midi

  15. #15
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Tu peut simplifier en faisant un NTILE = 1

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  16. #16
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Par défaut
    Bonsoir à tous!

    La requête est parfaite, merci à tous pour vos réponses rapides.

    Sur ce, bonne soirée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requête mysql compliquée portant sur l'année
    Par gosu14 dans le forum Requêtes
    Réponses: 8
    Dernier message: 03/07/2008, 17h18
  2. requête sql compliquée
    Par root76 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/08/2007, 15h53
  3. [Débutant] Requête assez compliquée
    Par pc.bertineau dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/06/2007, 11h46
  4. requête sql compliquée
    Par caoutchouc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/05/2007, 16h21
  5. Une requête bien compliquée pour moi
    Par bellande dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 01/02/2007, 21h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo