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 :

Sélectionner ligne dernière date


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Sélectionner ligne dernière date
    bonjour
    je souhaite récupérer la dernière ligne par date de dernier enregistrement


    exemple


    [TH]ID[/TH]
    [TH]STA_SiteNumber[/TH]
    [TH]INF_NumberInStation[/TH]
    [TH]INF_Date[/TH]
    [TH]INF_Value[/TH]
    0001300025 13 25 2020-09-14 12:25:31.0000000 131
    0001300025 13 25 2020-09-14 12:26:31.0000000 131
    0001300025 13 25 2020-09-14 13:13:20.0000000 150
    0001300025 13 21 2020-09-14 13:13:20.0000000 100
    0001300025 13 21 2020-09-17 13:13:20.0000000 120
    0001300025 13 21 2020-09-17 14:13:00.0000000 125

    je souhaite ceci


    [TH]ID[/TH]
    [TH]STA_SiteNumber[/TH]
    [TH]INF_NumberInStation[/TH]
    [TH]INF_Date[/TH]
    [TH]INF_Value[/TH]
    0001300025 13 25 2020-09-14 13:13:20.0000000 150
    0001300025 13 21 2020-09-17 14:13:00.0000000 125

    pour le moment j'ai cette requête en vba
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Set rs = conn.Execute("SELECT  ID,STA_SiteNumber,INF_NumberInStation,INF_Date ,INF_Value FROM [dbo].[View_ArchivedInformations]" _
    & "  WHERE  " & site & " AND " & stat & "   ")


    je sélectionne avec des variables STA_SiteNumber et INF_NumberInStation

    merci pour votre aide

  2. #2
    Modérateur

    bonjour

    Vous trouverez toutes les explications et exemples nécessaires ici...

  3. #3
    Membre à l'essai
    bonjour
    oui javais trouvé cette page , mais l'exemple montre avec 2 bases , moi je n'en ai qu'une
    et je n'arrive pas a l' adapté
    merci d avoir répondu

  4. #4
    Expert éminent sénior
    Non pas deux bases mais deux tables, nuance
    Si vous n'avez qu'une seule table, il suffit de faire une auto-jointure en utilisant deux alias différents

  5. #5
    Modérateur

    on pas de jointure du tout, si on utilise une fonction fenétrée (exemple 3 dans le lien)

    DENSE_RANK, ou ROW_NUMBER...

  6. #6
    Expert éminent sénior
    Exemple basé sur la solution 2 de mon blog

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT ID
         , STA_SiteNumber
         , INF_NumberInStation
         , INF_Date
         , INF_Value 
    FROM dbo.View_ArchivedInformations  as main 
    WHERE [...] -- vos filtres paramétrés
      AND NOT EXISTS
         (SELECT 1
          from dbo.View_ArchivedInformations  as subq
          where subq.ID      = main.ID
            and subq.INF_Date> main.INF_Date
         )


    ici on utilise deux alias "MAIN" et "SUBQ" pour la même table

  7. #7
    Membre à l'essai
    bonjour


    je test et vous tient informé decalage horaire oblige

    merci encore

  8. #8
    Rédacteur

    Ave la fonction de fenêtrage :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH T AS (
    SELECT *, MAX(INF_Date) OVER(PARTITION BY ID)AS LAST_DATE
    FROM   dbo.View_ArchivedInformations  as main 
    WHERE  ... -- vos filtres paramétrés)
    SELECT * FROM T WHERE INF_Date = LAST_DATE;


    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  9. #9
    Membre à l'essai
    bonjour
    merci déjà d’avance
    voici le code que j’ai installé
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     Set rs = conn.Execute( WITH T AS (SELECT *, MAX(INF_Date) OVER(PARTITION BY ID) AS LAST_DATE FROM   dbo.View_ArchivedInformations  as main WHERE  " & site & " AND " & stat & " SELECT * FROM T WHERE INF_Date = LAST_DATE )


    en sachant que je recupere ses infos via du vba excel j'ai une erreur erreur de compilation

  10. #10
    Membre à l'essai
    bon voici un code qui fonctionne apres des recherche sur ce forum
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     Set rs = conn.Execute("SELECT T1.ID, T1.STA_SiteNumber, T1.INF_NumberInStation , T1.INF_Date , T1.INF_Value FROM dbo.View_ArchivedInformations AS T1 GROUP BY T1.ID, T1.STA_SiteNumber, T1.INF_NumberInStation , T1.INF_Date , T1.INF_Value HAVING (((T1.INF_Date)>=(select max(INF_Date) from dbo.View_ArchivedInformations where INF_NumberInStation=T1.INF_NumberInStation and ( " & site & " AND " & stat & " ))))")


    maintenant comment faire en sélectionnant 2 dates car avec ce code je prend que la dernière date et je souhaiterais également avec toute les dates

    merci pour votre aide

  11. #11
    Expert éminent sénior
    Si c'est pour utiliser un max, vous auriez du appliquer la méthode 1 de mon blog plutôt que d'utiliser un regroupement inutile puisque vous ne calculez aucun agrégat.
    Par ailleurs, les requêtes écrites sur une seule ligne sont illisibles et les parenthèses surnuméraires n'aident pas non plus à la compréhension.
    Pensez à la maintenance, un peu de soin dans la présentation des requêtes n'est pas un luxe.

    Ce qui donne

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      SELECT T1.ID
           , T1.STA_SiteNumber
           , T1.INF_NumberInStation 
           , T1.INF_Date 
           , T1.INF_Value 
      FROM dbo.View_ArchivedInformations AS T1 
      WHERE T1.INF_Date=                      
           (SELECT MAX(S1.INF_Date)            
            FROM dbo.View_ArchivedInformations AS S1                 
            WHERE S1.ID = T1.ID
           )  
      ;


    Ajoutez vos paramètres de filtrage et le tour est joué

  12. #12
    Membre à l'essai
    merci encore
    ce code fonctionne parfaitement
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set rs = conn.Execute(" SELECT T1.ID , T1.STA_SiteNumber, T1.INF_NumberInStation, T1.INF_Date, T1.INF_Value " _
     & " FROM dbo.View_ArchivedInformations AS T1  " _
     & " WHERE ((T1.STA_SiteNumber = 16 or T1.STA_SiteNumber = 15 or T1.STA_SiteNumber = 14 )and T1.INF_NumberInStation < 49) " _
     & " AND T1.INF_Date= (SELECT MAX(S1.INF_Date)  " _
     & " FROM dbo.View_ArchivedInformations AS S1     WHERE S1.ID = T1.ID       )")



    Si je veux rajouter une date comment je doit faire pour quelle me prenne la derniere valeur enregistre le jour selectionné

  13. #13
    Expert éminent sénior
    Bonjour,

    Dans ce cas je préfère la solution utilisant une fonction OLAP, par exemple :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      select * from (
          SELECT T1.ID
               , T1.STA_SiteNumber
               , T1.INF_NumberInStation 
               , T1.INF_Date 
               , T1.INF_Value 
               , row_number() over(partition by ID, convert(date, T1.INF_Date)
                                       order by T1.INF_Date desc
                                  ) 
                 as RN
          from dbo.View_ArchivedInformations T1
          where convert(date, T1.INF_Date)='2020-09-17'
                    ) as subq
      where subq.RN=1


    La restriction sur la date est dans la sous requête

###raw>template_hook.ano_emploi###