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

Développement SQL Server Discussion :

where V1, V2 not in (select V1, V2 /édité/


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut where V1, V2 not in (select V1, V2 /édité/
    Bonjour,

    Je souhaite filtrer sur deux champs en même temps mais je me fais "jeter".

    /edit : j'ajoute la requête complète pour clarifier mon problème/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT CAST(COUNT(*) AS FLOAT) / CAST(COUNT(DISTINCT DATEADD(MINUTE, -DATEPART(MINUTE, Date), Date)) AS FLOAT)
    FROM TabLog
    WHERE	Canal = @Canal
    	AND Date >= @DateDebut
    	AND Date < @DateFin
    	AND source, destination NOT IN ( SELECT TOP 3 source, destination
    						FROM TabLog
    						WHERE	Canal = @Canal
    							AND Date >= @DateDebut
    							AND Date < @DateFin
    						GROUP BY source, destination
    						ORDER BY COUNT(*) DESC)
    HAVING COUNT(DISTINCT DATEADD(MINUTE, -DATEPART(MINUTE, Date), Date)) > 0
    /edit : précision sur le problème/
    L'idée est de calculer la moyenne horaire du nombre de logs sur un canal @Canal pendant la période @DateDebut-@DateFin en ne considérant que les heures où il y a eu du trafic, SANS TENIR COMPTE DES TROIS PLUS GROS CONSOMMATEURS.
    J'ai résolu le problème en bidouillant un cast(V1 as varchar)+':'+cast(V2 as varchar) pour n'avoir qu'une seule variable.
    /edit : j'ajoute le code qui marche mais qui n'est pas propre/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT CAST(COUNT(*) AS FLOAT) / CAST(COUNT(DISTINCT DATEADD(MINUTE, -DATEPART(MINUTE, Date), Date)) AS FLOAT)
    FROM TabLog
    WHERE	Canal = @Canal
    	AND Date >= @DateDebut
    	AND Date < @DateFin
    	AND CAST(source AS VARCHAR)+':'+CAST(destination AS VARCHAR) NOT IN ( SELECT TOP 3 CAST(source AS VARCHAR)+':'+CAST(destination AS VARCHAR)
    						FROM TabLog
    						WHERE	Canal = @Canal
    							AND Date >= @DateDebut
    							AND Date < @DateFin
    						GROUP BY CAST(source AS VARCHAR)+':'+CAST(destination AS VARCHAR)
    						ORDER BY COUNT(*) DESC)
    HAVING COUNT(DISTINCT DATEADD(MINUTE, -DATEPART(MINUTE, Date), Date)) > 0
    Mais je voulais savoir s'il y avait solution plus propre à mon problème.

    Merci.

  2. #2
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    bonjour,
    Il n'est pas possible de comparer des 2-uplets avec in (ni avec les autres opérateurs..) .
    Pour éviter la bidouille je passerai plutot par une sous reqt correlée mais attention aux performances en cas de gros volume de données.
    La requête est du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
    from table1 as t1
    where exist(select * from table2 as t2 where t2.v1=t1.v1 and t2.v2=t1.v2)

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse.

    Ma requête est déjà complexe, avec une jointure et une sous-requête... Et le volume de données est important.

    Après discussion avec un collègue, un cursor semblera plus efficace que la super requête qui donne le résultat en un coup...

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 888
    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 : 21 888
    Points : 53 121
    Points
    53 121
    Billets dans le blog
    6
    Par défaut
    J'ai résolu le problème en bidouillant un cast(V1 as varchar)+':'+cast(V2 as varchar) pour n'avoir qu'une seule variable, mais je voulais savoir s'il y avait solution plus propre à mon problème
    Ca c'est pas propre !

    Après discussion avec un collègue, un cursor semblera plus efficace que la super requête qui donne le résultat en un coup...
    Ca c'est dégueulasse à immonde !

    la solution la plus performante est effectivement le EXISTS.

    A +

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses. J'ai essayé votre proposition, mais la requête semble trop complexe pour permettre d'ajouter un filtre NOT exists (je pense que pour mon problème, je dois remplacer mon NOT IN par un NOT EXISTS et non par un EXISTS). J'ai essayé avec des valeurs particulières des variables et ça ne sort aucun résultat.
    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
    SELECT CAST(COUNT(*) AS FLOAT) / CAST(COUNT(DISTINCT DATEADD(MINUTE, -DATEPART(MINUTE, Date), Date)) AS FLOAT)
    FROM TabLog T
    WHERE	Canal = @Canal
    	AND Date >= @DateDebut
    	AND Date < @DateFin
    	AND NOT EXISTS (SELECT TOP 3 *
    					FROM TabLog
    					WHERE	Canal = @Canal
    						AND Date >= @DateDebut
    						AND Date < @DateFin
    						AND source = T.source
    						AND destination = T.destination
    					GROUP BY source, destination
    					ORDER BY COUNT(*) DESC)
    HAVING COUNT(DISTINCT DATEADD(MINUTE, -DATEPART(MINUTE, Date), Date)) > 0
    Si certains sont intéressés par ce défi et qu'ils ont la patience de s'y coller, j'ai édité mon premier post pour donner des précisions sur le problème. Maintenant, je comprendrais que vous trouviez que ça commence à faire un peu trop casse tête pour m'aider à être propre...

    Bonne soirée !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 888
    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 : 21 888
    Points : 53 121
    Points
    53 121
    Billets dans le blog
    6
    Par défaut
    D'abord il est stupide de faire un TOP 3 dans une sous requête introduite par EXISTS....

    Votre requête serait quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT CAST(COUNT(*) AS FLOAT) / CAST(COUNT(DISTINCT DATEADD(MINUTE, - DATEPART(MINUTE, Date), Date)) AS FLOAT)
    FROM   TabLog AS T
    WHERE  Canal = @Canal
      AND  Date >= @DateDebut
      AND  Date <  @DateFin
      AND  NOT EXISTS(SELECT *
                      FROM   TabLog T2
                      WHERE	 Canal = @Canal
                        AND  Date >= @DateDebut
                        AND  Date < @DateFin
                        AND  T.source = T2.source
                        AND  T.destination = T2.destination)
    HAVING COUNT(DISTINCT DATEADD(MINUTE, -DATEPART(MINUTE, Date), Date)) > 0
    A +

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Tout à fait d'accord avec vous quant à la stupidité d'un TOP 3 avec un EXISTS. Je devais commencer à fatiguer... Par contre, votre requête revient à demander que le calcul ne prenne en compte que les enregistrements qui n'existent pas... Ca ne donne pas un meilleur résultat.

    Apparemment, il n'y a pas de solution simple à ce problème et je remercie tous ceux qui ont pris la peine et le temps de se pencher dessus.

    Bonne journée.

Discussions similaires

  1. NOT IN (SELECT) sous MySQL
    Par tinou66644 dans le forum Requêtes
    Réponses: 4
    Dernier message: 17/06/2011, 12h05
  2. Réponses: 18
    Dernier message: 05/12/2008, 10h45
  3. Not In(Select ..
    Par Invité dans le forum Access
    Réponses: 11
    Dernier message: 05/08/2006, 12h00
  4. [SQL]: Requête NOT IN SELECT(...)
    Par CAPPE dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/06/2005, 14h06
  5. a,b,c NOT IN (select a,b,c from table)
    Par szdavid dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2005, 09h19

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