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

Langage SQL Discussion :

obtenir 100 lignes autour d'une valeur cible


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut obtenir 100 lignes autour d'une valeur cible
    Bonjour

    Sous SQL server 2005 et avec la table suivante
    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
    CREATE TABLE [dbo].[T_ARTICLES_ART](
    	[ART_ID] [bigint] IDENTITY(1,1) NOT NULL,
    	[ART_STYPE] [smallint] NULL,
    	[ART_FAMILLE] [dbo].[D_FAMILLE_ARTICLE] NULL,
    	[ART_REF_CONSTR] [dbo].[D_REF_ARTICLE] NULL,
    	[ART_LIBELLE] [dbo].[D_LIBELLE_ARTICLE] NULL,
    	[ART_PU] [dbo].[D_MT_MONETAIRE] NULL,
    	[ART_PU_BASE] [dbo].[D_MT_MONETAIRE] NULL,
     CONSTRAINT [PK_T_ARTICLES_ART] PRIMARY KEY CLUSTERED 
    (
    	[ART_ID] ASC
    )WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    Je voudrais obtenir 50 lignes avant et 50 après d'une valeur cible
    par rapport à un index, par exemple pour la valeur cible
    ART_FAMILLE = 'MERL' et ART_REF_CONSTR = '01019'
    J'essaie avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT TOP 50 -1 AS RANG, * FROM T_ARTICLES_ART
    WHERE ART_FAMILLE + ART_REF_CONSTR < 'MERL01019'
    UNION
    SELECT 0 AS RANG, * FROM T_ARTICLES_ART
    WHERE ART_FAMILLE ='MERL' AND ART_REF_CONSTR = '01019'
    UNION
    SELECT TOP 50 1 AS RANG, * FROM T_ARTICLES_ART
    WHERE (ART_FAMILLE + ART_REF_CONSTR) > 'MERL01019'
    Mais cela ne fonctionne pas
    il faudrait pour les 50 lignes qui précédent utiliser
    ORDER BY ART_FAMILLE, ART_REF_CONSTR DESC et
    pour les 50 lignes qui suivent utiliser
    ORDER BY ART_FAMILLE, ART_REF_CONSTR mais le union ne semble pas
    autoriser un ORDER BY à l'intérieur
    et d'autre part si je scinde ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT TOP 50 -1 AS RANG, * FROM T_ARTICLES_ART
    WHERE ART_FAMILLE + ART_REF_CONSTR < 'MERL01019'
    ORDER BY ART_FAMILLE, ART_REF_CONSTR DESC
    Ne ramène pas les 50 lignes qui précédent mais le début de ma table
    Je peux utiliser une PS pour la limitation sur le order by, mais cela ne me solutionne pas le problème du retour des 50 lignes avent

    Quelqu'un à t'il une idée et envie de m'aider SVP?
    Bruno Petit

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par PickEpique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT TOP 50 -1 AS RANG, * FROM T_ARTICLES_ART
    WHERE ART_FAMILLE + ART_REF_CONSTR < 'MERL01019'
    ORDER BY ART_FAMILLE, ART_REF_CONSTR DESC
    Ne ramène pas les 50 lignes qui précédent mais le début de ma table
    En effet, il faudrait utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...ORDER BY ART_FAMILLE DESC, ART_REF_CONSTR DESC
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut
    J'ai oublié de préciser que j'ai un index sur 'ART_FAMILLE + ART_REF_CONSTR
    et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT TOP 50 -1 AS RANG, * FROM T_ARTICLES_ART
    WHERE ART_FAMILLE + ART_REF_CONSTR < 'MERL01019'
    ORDER BY ART_FAMILLE + ART_REF_CONSTR DESC
    Cela fonctionne mais c'est relativement lent 4 à 5 secondes
    pour une table de 690 000 lignes, or c'est un peu gènant car
    c'est pour mimer une recherche incrémentale à la façon
    des tables fichiers (genre paradox)
    Bruno Petit

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut
    Oui c'est vrai j'ai oublié qu'il fallait préciser le sens pour chaque
    colonne de la clause order (quel étourdi je fais), mais pour
    les 3 requètes à la fois avec des unions,vous n'auriez pas une idée
    ainsi que pour la vitesse
    Bruno Petit

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut
    En ajoutant une colonne indexée et COMPUTED; ART_FAMREF = ART_FAMILLE + ART_REF_CONSTR, cela redevient tout à fait
    acceptable question rapidité ( < 1 sec) , qu'en est il d'une colonne
    computed et indexée, les valeurs sont elles stockées ?
    Bruno Petit

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par PickEpique
    En ajoutant une colonne indexée et COMPUTED; ART_FAMREF = ART_FAMILLE + ART_REF_CONSTR, cela redevient tout à fait
    acceptable question rapidité ( < 1 sec) , qu'en est il d'une colonne
    computed et indexée, les valeurs sont elles stockées ?
    C'est sur le forum SQL Server que tu auras plus de chances d'avoir une réponse à cette question...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut
    oui en effet
    merci
    Bruno Petit

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut
    Pour l'autre partie de mon problème je ne savais pas que
    Lorsque UNION est utilisé, les instructions SELECT individuelles ne peuvent pas comporter leurs propres clauses ORDER BY ou COMPUTE. Il ne peut exister qu'une seule clause ORDER BY ou COMPUTE après la dernière instruction SELECT
    Donc pas possible le ORDER BY DESC sur le premier SELECT.
    Au final j'imagine qu'il soit nécessaire je fisse une PS (psshhh)
    Donc question de débutant
    Comment fait on pour réunir le résultat de 3 SELECT
    au sein d'une procedure stockée
    Bruno Petit

Discussions similaires

  1. Selectionner des observations autour d'une valeur
    Par mariem84 dans le forum SAS Base
    Réponses: 8
    Dernier message: 20/06/2012, 12h04
  2. Alimenter une valeur cible
    Par grodeg dans le forum Développement de jobs
    Réponses: 6
    Dernier message: 13/03/2012, 19h17
  3. [XL-2003] Suppression d'une ligne entière suite à une valeur
    Par will-1981 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 06/04/2009, 01h05
  4. Bouton qui pointe vers une valeur ciblée
    Par d_cer76 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/07/2008, 06h16
  5. Réponses: 2
    Dernier message: 05/03/2008, 22h01

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