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

PL/SQL Oracle Discussion :

Syntaxe Partition BY


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 218
    Par défaut Syntaxe Partition BY
    Si j'ai une table de 3 colonnes:
    - commandeID
    - commandeDate
    - stockLocation

    Exemple:
    commandeID -- commandeDate -- stockLocation
    commande1 -- 12/12/2009 -- A1
    commande5 -- 11/11/2009 -- B10
    commande4 -- 19/12/2009 -- B11
    commande1 -- 13/10/2010 -- Z12
    commande5 -- 14/11/2010 -- Z13
    commande1 -- 11/10/2010 -- A1


    Je veux partitionner la table dans le but d'obtenir un tel résultat:
    Rownum -- commandeID -- commandeDate -- stockLocation
    1 -- commande1 -- 12/12/2009 -- A1
    1 -- commande1 -- 11/10/2010 -- A1
    1 -- commande1 -- 13/10/2010 -- Z12

    2 -- commande4 -- 19/12/2009 -- B11

    3 -- commande5 -- 11/11/2009 -- B10
    3 -- commande5 -- 14/11/2010 -- Z13

    Quelle syntaxe dois-je utiliser pour repartir ces commandes en 3 partitions selon la commandeID et de les ordonner suivant: commandeID, commandeDate, et stockLocation. Je veux avoir le ROWNUM de cette façon.

    Mon probleme est qu'en utilisant:

    ROW_NUMBER() OVER(PARTITION BY commandeID ORDERBY commandeID,
    commandeDate, stockLocation)


    le ROWNUM est retournée de cette façon:
    Rownum -- commandeID -- commandeDate -- stockLocation
    1 -- commande1 -- 12/12/2009 -- A1
    2 -- commande1 -- 11/10/2010 -- A1
    3 -- commande1 -- 13/10/2010 -- Z12

    1 -- commande4 -- 19/12/2009 -- B11

    1 -- commande5 -- 11/11/2009 -- B10
    2 -- commande5 -- 14/11/2010 -- Z13

  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
    Utilisez dense_rank :
    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
    17
    18
    19
    20
    With Commande AS
    (  
    select 'c1' as cid, to_date('12/12/2009', 'dd/mm/yyyy') as cdt, 'A1' as csl from dual union all
    select 'c5'       , to_date('11/11/2009', 'dd/mm/yyyy')       , 'B10'       from dual union all
    select 'c4'       , to_date('19/12/2009', 'dd/mm/yyyy')       , 'B11'       from dual union all
    select 'c1'       , to_date('13/10/2010', 'dd/mm/yyyy')       , 'Z12'       from dual union all
    select 'c5'       , to_date('14/11/2010', 'dd/mm/yyyy')       , 'Z13'       from dual union all
    select 'c1'       , to_date('11/10/2010', 'dd/mm/yyyy')       , 'A1'        from dual
    )
    select dense_rank() over(order by cid asc) as rk,
           cid, cdt, csl
      from Commande;
     
    RK	CID	CDT		CSL
    1	c1	12/12/2009	A1
    1	c1	13/10/2010	Z12
    1	c1	11/10/2010	A1
    2	c4	19/12/2009	B11
    3	c5	14/11/2010	Z13
    3	c5	11/11/2009	B10

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Et un tri intermediare
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    SQL> With data as (
      2    select 'commande1' as commandeID,   to_date('12/12/2009','DD/MM/YYYY') as commandeDate,  'A1' as stockLocation from dual union all
      3    select 'commande5', to_date('11/11/2009','DD/MM/YYYY'), 'B10' from dual union all
      4    select 'commande4', to_date('19/12/2009','DD/MM/YYYY'), 'B11' from dual union all
      5    select 'commande1', to_date('13/10/2010','DD/MM/YYYY'), 'Z12' from dual union all
      6    select 'commande5', to_date('14/11/2010','DD/MM/YYYY'), 'Z13' from dual union all
      7    select 'commande1', to_date('11/10/2010','DD/MM/YYYY'), 'A1' from dual
      8  ),
      9  tridata as (
     10    Select *
     11      From data
     12      Order by commandeid, commandeDate, stockLocation
     13  )
     14  select d.*,
     15         dense_rank() over(ORDER BY commandeID)
     16    from tridata d
     17  /
     
    COMMANDEID COMMANDEDATE STOCKLOCATION DENSE_RANK()OVER(ORDERBYCOMMAN
    ---------- ------------ ------------- ------------------------------
    commande1  12/12/2009   A1                                         1
    commande1  11/10/2010   A1                                         1
    commande1  13/10/2010   Z12                                        1
    commande4  19/12/2009   B11                                        2
    commande5  11/11/2009   B10                                        3
    commande5  14/11/2010   Z13                                        3

  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
    Hello mnitu, pourquoi ce tri intermédiaire ?
    On peut utiliser dense_rank et trier dans la même requête :
    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
    17
    18
    19
    20
    21
    With Commande AS
    (  
    select 'c1' as cid, to_date('12/12/2009', 'dd/mm/yyyy') as cdt, 'A1' as csl from dual union all
    select 'c5'       , to_date('11/11/2009', 'dd/mm/yyyy')       , 'B10'       from dual union all
    select 'c4'       , to_date('19/12/2009', 'dd/mm/yyyy')       , 'B11'       from dual union all
    select 'c1'       , to_date('13/10/2010', 'dd/mm/yyyy')       , 'Z12'       from dual union all
    select 'c5'       , to_date('14/11/2010', 'dd/mm/yyyy')       , 'Z13'       from dual union all
    select 'c1'       , to_date('11/10/2010', 'dd/mm/yyyy')       , 'A1'        from dual
    )
      select dense_rank() over(order by cid asc) as rk,
             cid, cdt, csl
        from Commande
    order by rk asc, cdt asc, csl asc;
     
    RK	CID	CDT		CSL
    1	c1	12/12/2009	A1
    1	c1	11/10/2010	A1
    1	c1	13/10/2010	Z12
    2	c4	19/12/2009	B11
    3	c5	11/11/2009	B10
    3	c5	14/11/2010	Z13

  5. #5
    Membre expérimenté
    Inscrit en
    Mars 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 205
    Par défaut
    Beaucoup plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    select DENSE_RANK() OVER ( ORDER BY commandeID),commandeID,commandeDate,stockLocation from orders
     order by commandeid ,commandeDate,stockLocation
    Résultat :



    1 commande1 12/12/2009 A1
    1 commande1 11/10/2010 A1
    1 commande1 13/10/2010 Z12
    2 commande4 19/12/2009 B11
    3 commande5 11/11/2009 B10
    3 commande5 14/11/2010 Z13

  6. #6
    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 différence avec ma requête ?

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Hello mnitu, pourquoi ce tri intermédiaire ?
    On peut utiliser dense_rank et trier dans la même requête.
    il manqué un tri,

  8. #8
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 218
    Par défaut
    Merci pour vos réponses

    Pour partitionner les commandes et les ordonner suivant la date de la commande, j'ai utilisé cette commande et ça marche pour moi. Cette commande est correcte non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT orderid, stocklocation, orderdate, dense_rank() OVER(ORDER BY orderdate [ASC/DESC], orderid) as DR 
     
    FROM orders
     
    WHERE DR <= 4

Discussions similaires

  1. PB SYNTAXE : partition by list .. .. subpartition by range
    Par theworst dans le forum Administration
    Réponses: 3
    Dernier message: 13/03/2009, 14h08
  2. [9i] syntaxe de ALTER TABLE ... DROP PARTITION
    Par dyvim dans le forum Oracle
    Réponses: 1
    Dernier message: 03/02/2006, 11h52
  3. Syntaxe TASM <-> MASM
    Par LFC dans le forum Assembleur
    Réponses: 3
    Dernier message: 28/02/2003, 15h56
  4. Problème montage partition Win sous RedHat ??
    Par baba dans le forum Administration système
    Réponses: 6
    Dernier message: 18/01/2003, 11h26
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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