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 selon date la plus grande [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2006
    Messages : 242
    Points : 94
    Points
    94
    Par défaut Requête selon date la plus grande
    Bonjour
    J'ai une table où je suis les modifications de tâches:
    TSK_ID,PRJ_ID, TSK_BEGIN, TSK_END, TSK_REASON, TSK_DONE, TYP_ID et une colonne INSERT_DATETIME avec valeur getdate()

    Ce que je souhaite faire c'est avoir la liste pour un PRJ_ID donné, une ligne par TYP_ID avec le INSERT_DATETIME le plus élevé

    En gros je souhaite avoir la dernière modification de date d'un type de tâche par projet.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ...
    FROM   ... AS T
    WHERE  MaDate = (SELECT MAX(MaDate)
                     FROM   ... AS T2
                     WHERE  T.PRJ_ID = T2.PRJ_ID)
    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/ * * * * *

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2006
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    Merci
    Mais ça ne me sort pas ce que je souhaite, j'ai besoin d'une ligne par TYP_ID
    Là j'obtiens la ligne avec la date la plus élevée seulement.
    il me faudrait quelque chose du genre (mais c'est une syntaxe qui est fausse) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT ...
    FROM   ... AS T
    WHERE  (Madate,TYP_ID) IN (SELECT MAX(MaDate), T2.TYP_ID
                     FROM   ... AS T2
                     WHERE  T.PRJ_ID = T2.PRJ_ID GROUP BY T2.TYP_ID)

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2006
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    En gros j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    TSK_ID	PRJ_ID	TSK_BEGIN	TSK_END	TSK_REASON	TSK_DONE	TYP_ID	INSERT_DATETIME
    2	3	2018-11-30 00:00:00.000	2018-12-08 00:00:00.000	INITIAL	0	1	2018-12-07 11:08:49.830
    3	3	2018-12-08 00:00:00.000	2018-12-12 00:00:00.000	INITIAL	0	2	2018-12-07 11:09:06.013
    4	3	2018-12-12 00:00:00.000	2018-12-14 00:00:00.000	INITIAL	0	3	2018-12-07 11:09:26.270
    5	3	2018-12-14 00:00:00.000	2018-12-16 00:00:00.000	INITIAL	0	4	2018-12-07 11:09:35.637
    6	3	2018-12-16 00:00:00.000	2018-12-18 00:00:00.000	INITIAL	0	5	2018-12-07 11:09:44.217
    7	3	2018-12-20 00:00:00.000	2018-12-23 00:00:00.000	CUSTOMER POSTPONED	0	5	2018-12-07 11:10:19.580
    Je veux ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TSK_ID	PRJ_ID	TSK_BEGIN	TSK_END	TSK_REASON	TSK_DONE	TYP_ID	INSERT_DATETIME
    2	3	2018-11-30 00:00:00.000	2018-12-08 00:00:00.000	INITIAL	0	1	2018-12-07 11:08:49.830
    3	3	2018-12-08 00:00:00.000	2018-12-12 00:00:00.000	INITIAL	0	2	2018-12-07 11:09:06.013
    4	3	2018-12-12 00:00:00.000	2018-12-14 00:00:00.000	INITIAL	0	3	2018-12-07 11:09:26.270
    5	3	2018-12-14 00:00:00.000	2018-12-16 00:00:00.000	INITIAL	0	4	2018-12-07 11:09:35.637
    7	3	2018-12-20 00:00:00.000	2018-12-23 00:00:00.000	CUSTOMER POSTPONED	0	5	2018-12-07 11:10:19.580

  5. #5
    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 789
    Points
    30 789
    Par défaut
    Poté maintes fois sur ce forum...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  ...
    FROM    ... AS T1
    WHERE   (   SELECT  NULL
                FROM    ... AS T2
                WHERE   T1.PRJ_ID   = T2.PRJ_ID
                    AND T1.TYP_ID   = T2.TYP_ID
                HAVING  T1.MaDate   = MAX(T2.MaDate)
            )
    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.

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2006
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    J'ai une erreur sur le SELECT NULL :
    Expression de type non booléen spécifiée dans un contexte où une condition est attendue

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2006
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    J'ai rajouté IS NULL à la fin
    mais j'obtiens toujours ma liste complète, la ligne 6 devrait disparaître...

  8. #8
    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,

    Dans la requête de SQLPro, il suffit de rajouter dans la sous requête une vérification d'égalité sur TYP_ID

    Dans celle de al1_24, il suffit d'ajouter le EXISTS devant la sous requête.

    Sinon, vous pouvez aussi faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    WITH CTE AS (
        SELECT *, ROW_NUMBER() OVER(PARTITION BY PRJ_ID, TYP_ID ORDER BY INSERT_DATETIME DESC) AS RN
        FROM LaTable
    )
    SELECT col1, col2,...
    FROM CTE
    WHERE RN = 1

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Allez, une version avec une sous-requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    selectfrom latable
    inner join (select id,max(ladate) as ladate from latable group by id) as soustable on soustable.id = t1.id and soustable.ladate = t1.ladate

    On peut aussi le faire avec un LEFT OUTER JOIN, un NOT EXISTS...

    Tatayo.

  10. #10
    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 789
    Points
    30 789
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Dans celle de al1_24, il suffit d'ajouter le EXISTS devant la sous requête.
    Je suis confus
    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.

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2006
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    Merci pour toutes les solutions, c'est efficace
    Celle avec les Row_Number est plus lisible à mon goût mais la version avec EXISTS une fois comprise est pas mal non plus
    Encore merci

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

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