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 :

Requête de numérotation par bloc


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Par défaut Requête de numérotation par bloc
    Bonjour à tous,

    Je voudrais faire une requête en évitant de passer par des curseurs mais la je sèche un peu. J'aurais besoins d'un peu d'aide. Je travail sur une base tournant sous Sqlserver 2005 et 2008.

    J'ai une table avec un numéro d'utilisateur et une date et heure. Je voudrais numéroter les lignes par utilisateur par date et surtout par bloc. La numérotation pour un utilisateur recommence à 1 après chaque bloc.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    N°user    dateHeure                     ResultatVoulu
    9999	     20091116 020340           1
    9999	     20091116 032926           2
    1777	     20091116 055644           1
    1777	     20091116 080406           2
    1777	     20091116 093814           3
    1777	     20091116 095940           4
    1777	     20091116 102600           5
    9999	     20091116 234758           1
    9999	     20091116 235116           2
    9999	     20091116 235444           3
    En utilisant un RANK() la numérotation ne recommence pas à 1 après chaque bloc.

    Est ce que quelqu'un aurait une astuce pour ce genre de problème.


    Merci d'avance

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Utilisez pour cela la clause PARTITION BY dans la clause OVER() de la fonction RANK()

    @++

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Par défaut
    J'avais bien mis la clause partition mais la numérotation ne recommence pas à 1.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	select 
    	noutilisateur,dateheure,	
    	RANK() over (partition by noutilisateur order by  dateheure)	
    	from test
    	order by dateheure

    Voici le script de création de la table :

    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
    CREATE TABLE [dbo].[test](
    	[noUtilisateur] [int] NULL,
    	[dateHeure] [char](15) COLLATE French_CI_AS NULL
    )
    Go
     
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (9999, N'20091116 020340')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (9999, N'20091116 032926')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 055644')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 080406')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 093814')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 095940')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 102600')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 110828')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 130034')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 150840')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 155452')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 160814')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 161728')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 172826')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (1777, N'20091116 173524')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (9999, N'20091116 234758')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (9999, N'20091116 235116')
    INSERT [dbo].[test] ([noUtilisateur], [dateHeure]) VALUES (9999, N'20091116 235444')

  4. #4
    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
    1) L'exemple que vous nous avez donné est faux, car vous ne nous précisez pas la notion de BLOC !
    2) votre requête est fausse car elle ne prend pas en compte la colonne noutilisateur dans les clause ORDER BY.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT noutilisateur,dateheure,	
    	   ROW_NUMBER() over (partition BY noutilisateur ORDER BY  noutilisateur, dateheure) AS NUM	
    FROM test
    ORDER BY noutilisateur, dateheure
    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/ * * * * *

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Par défaut
    L'exemple que j'ai transmis correspond au résultat attendu.
    Je voudrais pouvoir recommencer la numérotation à chaque changement
    d'utilisateur tout en conservant l'ordre chronologique.

    Dans l'exemple j'ai 3 blocs :

    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
    bloc 1:
     
    9999	     20091116 020340           
    9999	     20091116 032926           
     
    bloc 2:
     
    1777	     20091116 055644           
    1777	     20091116 080406           
    1777	     20091116 093814           
    1777	     20091116 095940           
    1777	     20091116 102600           
     
    bloc 3:
    9999	     20091116 234758           
    9999	     20091116 235116           
    9999	     20091116 235444


    C'est le 3ème bloc qui me pose problème. La numérotation se poursuit alors
    que je voudrais qu'elle recommence à 1.

  6. #6
    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
    Vous venez donc de découvrir qu'il vous manque une information dans votre table, celle de bloc.
    Un SGBDR ne peut pas inventer une information qu'il n'a pas.
    De plus dans un SGBDR il n'existe pas d'ordre des lignes, car la théorie sur laquelle repose les SGBDR est la théorie des ensembles...
    Lisez ceci pour vous en convaincre : http://blog.developpez.com/sqlpro/p5...sont-des-ense/

    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/ * * * * *

  7. #7
    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
    Vous manquez d'imagination SQLPro, il y a tout ce qu'il faut :
    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
    28
    29
    30
    31
    32
    WITH TEST2 (noUtilisateur, dateHeure, bloc) AS
    (
    select noUtilisateur, dateHeure,
           row_number() over(                           order by dateHeure asc) - 
           row_number() over(partition by noUtilisateur order by dateHeure asc)
      from TEST
    )
      select noUtilisateur, dateHeure,
             row_number() over(partition by bloc order by dateHeure asc) as rn
        from TEST2
    order by dateHeure asc;
     
    noUtilisateur dateHeure       rn
    ------------- --------------- --------------------
    9999          20091116 020340 1
    9999          20091116 032926 2
    1777          20091116 055644 1
    1777          20091116 080406 2
    1777          20091116 093814 3
    1777          20091116 095940 4
    1777          20091116 102600 5
    1777          20091116 110828 6
    1777          20091116 130034 7
    1777          20091116 150840 8
    1777          20091116 155452 9
    1777          20091116 160814 10
    1777          20091116 161728 11
    1777          20091116 172826 12
    1777          20091116 173524 13
    9999          20091116 234758 1
    9999          20091116 235116 2
    9999          20091116 235444 3

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

Discussions similaires

  1. Ecrire le résultat d'une requête par blocs
    Par gdeon dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 12/12/2008, 15h02
  2. [SQL] Comment automatiser une requête SQL alimentée par un formulaire HTML?
    Par tse_tilky_moje_imja dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/06/2006, 23h46
  3. lecture par blocs dans un fichier avec marqueur
    Par cheikh_tk dans le forum C
    Réponses: 3
    Dernier message: 06/06/2006, 16h39
  4. Requête sélection : recherche par nom
    Par leeloo77 dans le forum Access
    Réponses: 7
    Dernier message: 17/02/2006, 15h39
  5. [Requête] sortir seulement un bloc d'enregistrement
    Par sekiryou dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/04/2005, 21h11

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