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 :

Rank partitionné par valeurs proches [2014]


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 57
    Points
    57
    Par défaut Rank partitionné par valeurs proches
    Bonjour.

    J'ai un souci avec une requête SQL, je voudrais faire un RANK partitionné par valeurs proche.
    Je m'explique, j'ai une table avec une liste de valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE #tmp (value INT)
    INSERT INTO #tmp
    VALUES (1)
    	,(7)
    	,(12)
    	,(27)
    	,(1000)
    	,(1002)
    	,(1025)
    	,(1254)
    	,(1265)
    	,(1300)
    	,(1399)
    	,(1780)

    Et je voudrais affecter un RANK identique aux valeurs dont l'espacement est inférieur à 100

    Soit obtenir:
    value;rank
    1;1
    7;1
    12;1
    27;1
    1000;2
    1002;2
    1025;2
    1254;3
    1265;3
    1300;3
    1399;3
    1780;4
    Et ensuite je ferais un min/max par rank pour obtenir:
    min;max
    1;27
    1000;1025
    1254;1399
    1780;1780
    Avez-vous une idée?

    Merci.
    sdisp

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Bonjour,

    Dans votre cas je ne pense que le RANK soit la solution la plus approprié...

    Essayez d'utiliser un CASE WHEN plus pratique, sachant que le moteur ne peut pas connaitre d'avance vos seuil ...

    https://msdn.microsoft.com/fr-fr/library/ms181765.aspx

    A+

    Julien
    MCSA SQL SERVER |MCT | MVP Data Platform

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    comme ceci ?

    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 S AS (
    	SELECT 
    			value
    		,	CASE WHEN value - LAG(value) OVER(ORDER BY value) < 100 THEN 0 ELSE 1 END as saut
    	FROM #tmp
    )	
    , G AS (
    	SELECT 
    			value
    		,	SUM(saut) OVER(ORDER BY value) AS groupe
    	FROM S
    )
    SELECT MIN(value), MAX(value)
    FROM G
    GROUP BY groupe

  4. #4
    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 801
    Points
    30 801
    Par défaut
    Ou comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select  a.value       as mini
        ,   max(b.value)  as maxi
    from    tmp a
        inner join
            tmp b
            on  abs(b.value - a.value) < 100
    group by a.value
    having  a.value = min(b.value)
    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.

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 57
    Points
    57
    Par défaut
    Bonjour.

    Merci à tous les 2 pour vos réponses ca fonctionne très bien.

    sdisp.

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

Discussions similaires

  1. limitation a un resultat par valeur d un champ
    Par venomelektro dans le forum Requêtes
    Réponses: 4
    Dernier message: 01/05/2006, 18h32
  2. Comptage par valeur
    Par solp dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/03/2006, 04h16
  3. Passage par Valeur
    Par xc78370 dans le forum Langage
    Réponses: 8
    Dernier message: 20/03/2006, 23h21
  4. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 10h29
  5. Tri par valeur d un hash de hash
    Par LeLaulau dans le forum Langage
    Réponses: 4
    Dernier message: 28/09/2005, 10h33

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