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 :

LAST_VALUE() ne fait pas ce que je veux, je suis perdu [2016]


Sujet :

Développement SQL Server

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut LAST_VALUE() ne fait pas ce que je veux, je suis perdu
    Bonjour,

    J'ai un besoin relativement classique :

    Sur un jeu de données, j'ai une clé (partition) et une colonne dont la valeur évolue en fonction d'une autre colonne d'horodatage.

    Je souhaite, pour chaque clé, obtenir la dernière valeur chronologique.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ID  Valeur Date
    1   A    2021-05-01
    1   B    2021-05-02
    1   C    2021-05-03
    1   B    2021-05-04
    2   D    2021-05-01
    2   A    2021-05-02
    Je souhaite avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ID  Valeur
    1   B
    2   A
    Je pensais bêtement faire :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select distinct id, last_value(valeur) over (partition by id order by date)
    from matable

    Mais last_value() ne fait pas du tout ça visiblement...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ID      Valeur
    1	A
    1	B
    1	C
    2	A
    2	D
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 194
    Points : 28 079
    Points
    28 079
    Par défaut
    si tu veux partitionner par id, je pense qu'il faut aussi d'abords trier par id. Je ne pense pas que la partition provoque automatiquement le tri.

    donc à mon avis il faudrait mettre order by id, date
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Plutôt que last_value(), j'utiliserai plutôt row_number() pour ne garder que la première ligne de chaque partition triée par date décroissante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select id, valeur
    from
       (select  id, valeur, row_number() over (partition by id order by date desc) as num_ordre
        from matable)
    where num_ordre = 1
    Remarque: row_number() ne sectionne qu'une seule ligne en cas d'ex aequo, si l'on veut garder les ex aequo on peur utiliser rank()

    Bonne soirée

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 142
    Points : 38 926
    Points
    38 926
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    je propose différentes solutions pour ce besoin dans mon blog ICI

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Avec LAST_VALUE Il faut étendre la sélection du fenêtrage jusqu'à UNBOUNDED FOLLOWING, par défaut le fenêtrage s'arrête à CURRENT ROW :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    last_value(valeur) over (partition by id order by date rows between unbounded preceding and unbounded following)

  6. #6
    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
    Ou encore, un first_value avec un tri descendant sur les dates :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    first_value(valeur) over (partition by id order by date desc)

  7. #7
    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
    Citation Envoyé par sevyc64 Voir le message
    Je ne pense pas que la partition provoque automatiquement le tri.
    Si heureusement, les tris sont propres à chaque partition.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 142
    Points : 38 926
    Points
    38 926
    Billets dans le blog
    9
    Par défaut
    PARTITION BY, GROUP BY, DISTINCT et UNION sans ALL impliquent un tri (et ORDER BY bien sûr )

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    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 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    PARTITION BY, GROUP BY, DISTINCT et UNION sans ALL impliquent un tri (et ORDER BY bien sûr )
    NON.... PARTITION BY, GROUP BY, DISTINCT et UNION sont généralement fait par hachage et pas par un tri trop couteux, sauf dans les mauvais SGBDR, ou sauf s'il existe un index qui le permet !

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

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 142
    Points : 38 926
    Points
    38 926
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    NON.... PARTITION BY, GROUP BY, DISTINCT et UNION sont généralement fait par hachage et pas par un tri trop couteux, sauf dans les mauvais SGBDR, ou sauf s'il existe un index qui le permet !

    A +
    Seulement sur les tous petits volumes non ?

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    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 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Seulement sur les tous petits volumes non ?
    Au contraire !!!!! Si petit volume => tri. Sur les grands volume le hachage est bien moins couteux !!!

    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
    CREATE TABLE T_AGG (ID INT IDENTITY, VAL VARCHAR(16));
    GO
     
    TRUNCATE TABLE T_AGG
     
    INSERT INTO T_AGG VALUES ('ABCDEF')
    GO 1000
     
    INSERT INTO T_AGG VALUES ('GHIJKL')
    GO 1000
     
    INSERT INTO T_AGG
    SELECT RIGHT(T1.VAL, FLOOR(7 * RAND(CAST(GETDATE() AS REAL)))) + LEFT(T2.VAL, FLOOR(7 * RAND(CAST(GETDATE() AS REAL))))
    FROM   T_AGG AS T1
           CROSS JOIN T_AGG AS T2
    Cet agrégat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(*), VAL
    FROM   T_AGG
    GROUP  BY VAL
    Conduit à un hachage

    En le forçant à faire un tri, c'est catastrophique en temps de réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*), VAL
    FROM   T_AGG
    GROUP  BY VAL
    OPTION (ORDER GROUP)
    20 fois plus couteux....

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

  12. #12
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Tiens, question qui n'a rien à voir, les GO 1000 fonctionnent dans quel éditeur ?

    Dans SQL Server Management Studio (le dernier) il me fait une erreur sur le 1000.

    Sinon, merci pour vos réponses.

    Je suis parti sur une solution à base de sous-requête (dans le premières réponses) mais j'ai oublié de marquer comme résolu.

    Il faudra que je reteste la solution proposé par waldar, même si je ne vois pas trop ce que va changer un first_value order by desc par rapport à un last_value order by asc.
    On ne jouit bien que de ce qu’on partage.

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    En relisant la réponse de skuatamad, je percute et me dit "ah mais oui mais c'est biensûr ! j'avais déjà eu le même souci et la même solution par le passé !"

    Je regrette juste que la documentation MSDN soit merdique et ne mentionne pas le bounding et propose des exemples aussi peu probants...
    On ne jouit bien que de ce qu’on partage.

  14. #14
    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
    Citation Envoyé par StringBuilder Voir le message
    Il faudra que je reteste la solution proposé par waldar, même si je ne vois pas trop ce que va changer un first_value order by desc par rapport à un last_value order by asc.
    Rien du tout si ce n'est éviter de mettre la spécification du fenêtrage, mais oui c'est conceptuellement exactement la même chose.

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

Discussions similaires

  1. Boucle for() qui ne fait pas ce que je veux
    Par Tendhor57 dans le forum Langage
    Réponses: 8
    Dernier message: 01/06/2013, 19h58
  2. Aspirateur de site fait pas ce que je veux
    Par pepper18 dans le forum Internet
    Réponses: 2
    Dernier message: 15/05/2013, 19h32
  3. Une View qui ne fait pas ce que je veux
    Par EmmanuelleC dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/08/2009, 08h41
  4. Réponses: 18
    Dernier message: 12/05/2009, 14h44
  5. Réponses: 11
    Dernier message: 13/07/2006, 10h08

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