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 :

Récupérer les dernières valeurs mise a jour de plusieurs champs


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Récupérer les dernières valeurs mise a jour de plusieurs champs
    Bonjour,

    J'ai la table suivante :

    |id_business | champ1 | champ2 | champ3 | ... | date_maj |
    |-------------------------------------------------------------------|
    | 1 | NULL | 3 | NULL | ... | 03/05/2010 |
    | 1 | toto | 4 | NULL | ... | 04/05/2010 |
    | 1 | NULL | NULL | NULL | ... | 05/05/2010 |
    | 1 | NULL | 5 | NULL | ... | 06/05/2010 |
    | 1 | NULL | NULL | 2010 | ... | 10/05/2010 |
    | 2 | bobo | NULL | 2009 | ... | 10/05/2010 |
    | 2 | NULL | 10 | NULL | ... | 10/05/2010 |
    | 2 | bobby | 11 | NULL | ... | 10/05/2010 |

    J'aimerais savoir s'il est possible de constituer une ligne par id_business avec pour chaque champ la dernière valeur non nulle mise a jour, sans faire une requête par champ.

    Les ligne que je voudrais constituer sont les suivantes :
    |id_business | champ1 | champ2 | champ3 | ... | date_maj |
    |-------------------------------------------------------------------|
    | 1 | toto | 5 | 2010 | ... | 03/05/2010 |
    | 2 | bobby | 11 | 2009 | ... | 10/05/2010 |


    Merci d'avance pour votre aide

  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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Malheureusement non.
    Si c'est pour un besoin ponctuel, on va dire que c'est moindre mal.

    Si c'est pour un besoin de production, et que vous êtes sous SQL Server 2008, pensez à utiliser la capture de changement de données.

    Si vous êtes sous SQL Server 2005, voyez les tutoriels de SQLPro sur l'historisation des données

    @++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM   suivante AS T
           INNER JOIN (SELECT id_business, MAX(data_maj) AS D
                       FROM   suivante 
                       GROUP BY id_business) AS TT
                 ON T.id_business = TT.id_business
                    AND T.data_maj = TT.D
    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/ * * * * *

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses.

    @elsuket : ma question porte sur un traitement qui va s'exécuter de manière régulière dans une journée. Je ne pourrais pas utiliser la capture de changement de données.


    @SQLpro : j'ai essayé la requête que vous avez écrite, avec la table test que j'ai donné dans mon premier message, mais elle me remonte la ligne dont la date_maj est la plus grande pour chaque id_business et pas les dernières valeurs non nulles pour chaque champ et chaque id_business.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Quand SQL Server implémentera les fonctions FIRST_VALUE / LAST_VALUE ce sera facilement faisable !

    Sont-elles prévues en 2008R2 ou bien faudra-t-il attendre une autre release ?

    Sur Oracle ça donne 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    With MaTable as
    (
    select 1 as idb, null as c1, 3 as c2, null as c3, to_date('03/05/2010', 'dd/mm/yyyy') as dt from dual union all
    select 1       , 'toto'    , 4      , null      , to_date('04/05/2010', 'dd/mm/yyyy')       from dual union all
    select 1       , null      , null   , null      , to_date('05/05/2010', 'dd/mm/yyyy')       from dual union all
    select 1       , null      , 5      , null      , to_date('06/05/2010', 'dd/mm/yyyy')       from dual union all
    select 1       , null      , null   , 2010      , to_date('10/05/2010', 'dd/mm/yyyy')       from dual union all
    select 2       , 'bobo'    , null   , 2009      , to_date('10/05/2010', 'dd/mm/yyyy')       from dual union all
    select 2       , null      , 10     , null      , to_date('10/05/2010', 'dd/mm/yyyy')       from dual union all
    select 2       , 'bobby'   , 11     , null      , to_date('10/05/2010', 'dd/mm/yyyy')       from dual
    )
      ,  mt as
    (
    select idb,
           last_value(c1 ignore nulls) over(partition by idb order by dt asc) as c1,
           last_value(c2 ignore nulls) over(partition by idb order by dt asc) as c2,
           last_value(c3 ignore nulls) over(partition by idb order by dt asc) as c3,
           dt,
           row_number() over(partition by idb order by dt desc) as rn
      from MaTable
    )
    select idb, c1, c2, c3, dt
      from mt
     where rn = 1;
     
    IDB	C1	C2	C3	DT
    1	toto	5	2010	10/05/2010
    2	bobo	11	2009	10/05/2010

  6. #6
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Citation Envoyé par aspgic
    @elsuket : ma question porte sur un traitement qui va s'exécuter de manière régulière dans une journée. Je ne pourrais pas utiliser la capture de changement de données.
    La capture de changement de données peut tout à fait s'utiliser en production.
    C'est d'ailleurs ce qui est fait pour une certaine fonctionnalité de l'application développée dans mon entreprise.

    Citation Envoyé par Waldar
    Quand SQL Server implémentera les fonctions FIRST_VALUE / LAST_VALUE ce sera facilement faisable !
    Dommage effectivement qu'elles ne soient pas implémentées dans SQL Server, d'autant que celle-ci fait partie de la norme 2008 ...

    @++

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/04/2013, 18h20
  2. [Wamp] Récupérer les données après mise à jour de wamp
    Par JLC83 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 18/09/2008, 10h11
  3. Récupérer les dernières lignes modifiées
    Par Mythrandil dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/06/2007, 10h33
  4. Réponses: 7
    Dernier message: 06/03/2006, 12h19
  5. [Séquences] Pour récupérer la dernière valeur
    Par tnodev dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 24/05/2005, 11h35

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