Commentaires

  1. Avatar de JeitEmgie
    • |
    • permalink
    Pour le fun avec match_recognize :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select B7IDEN as c2, c3, c4, c5, c6 
    from (select * FROM TBB7 INNER JOIN TBB8 ON  B8IDEN = B7IDEN)
    match_recognize (
        partition by B7IDEN order by B8DTHR desc
        measures first(B7CPTE) c3, first(B8SEQN) c4, first(B8MONT) c5, first(B8DTHR) c6
        pattern( X+ )
        define X as 1 = 1
    )
    ;
  2. Avatar de escartefigue
    • |
    • permalink
    Merci également
  3. Avatar de Waldar
    • |
    • permalink
    Hello, bon résumé.

    J'ajouterai les solutions propriétaires à Oracle, PostgreSQL & SQL-Server qui sont elles sont moins portables, offrent des performances de premier ordre.

    Oracle
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      select b7.b7iden
           , b7.b7cpte
           , max(b8.b8seqn) keep (dense_rank first order by b8.b8dthr desc) as b8seqn
           , max(b8.b8mont) keep (dense_rank first order by b8.b8dthr desc) as b8mont
           , max(b8.b8dthr)                                                 as b8dthr
        from tbb7 b7
        join tbb8 b8 on b8.b8iden = b7.b7iden
    group by b7.b7iden
           , b7.b7cpte;

    PostgreSQL
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      select distinct on (b7.b7iden)
             b7.b7iden
           , b7.b7cpte
           , b8.b8seqn
           , b8.b8mont
           , b8.b8dthr
        from tbb7 b7
        join tbb8 b8 on b8.b8iden = b7.b7iden
    order by b7.b7iden  asc
           , b8.b8dthr desc;

    SQL-Server
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
         select b7.b7iden
              , b7.b7cpte
              , b8.b8seqn
              , b8.b8mont
              , b8.b8dthr
           from tbb7 b7
    cross apply ( select top 1 tbb8.b8seqn, tbb8.b8mont, tbb8.b8dthr 
                    from tbb8 
                   where tbb8.b8iden = b7.b7iden
                order by tbb8.b8dthr desc) b8;

    À noter qu'à partir d'Oracle 12c, on peut également utiliser cross apply :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
         select b7.b7iden
              , b7.b7cpte
              , b8.b8seqn
              , b8.b8mont
              , b8.b8dthr
           from tbb7 b7
    cross apply ( select tbb8.b8seqn, tbb8.b8mont, tbb8.b8dthr 
                    from tbb8 
                   where tbb8.b8iden = b7.b7iden
                order by tbb8.b8dthr desc
                fetch first 1 rows only) b8;
  4. Avatar de escartefigue
    • |
    • permalink
    Merci pour ce complément,

    La liste n'est bien sur pas exhaustive, il existe encore d'autres solutions (avec except par exemple)
    En fonction du contexte, la solution la plus optimale peut varier, il faut proto-typer en conditions proches de la production pour choisir celle qui est la plus efficiente.
  5. Avatar de tatayo
    • |
    • permalink
    Bonjour,
    J'ajouterai comme méthode l'utilisation d'une jointure externe:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT B7IDEN                        
            , B7CPTE                        
            , B8SEQN                        
            , B8MONT                        
            , B8DTHR                        
       FROM TBB7                            
       INNER JOIN TBB8  B8                  
         ON  B8.B8IDEN = B7IDEN
    left outer join TBB8 S8                   
             WHERE S8.B8IDEN = B8.B8IDEN    
               AND S8.B8DTHR > B8.B8DTHR
    where S8.B8IDEN is null

    Tatayo.