0

Table: A

| ID  | Name    | 
| --  | ------- |
| 1   | John    |
| 2   | Micheal |
| 3   | Mary    |

Table B:

| ID  | Date     | Bonus |
| --  | -------- | ----- |
| 1   | 01/01/09 | 1200  |
| 1   | 01/07/12 | 4000  |
| 1   | 12/05/14 | 2500  |
| 3   | 01/01/09 | 0     |
| 3   | 11/10/17 | 1850  |
| 2   | 08/01/16 | 2500  |
| ... |    ...   |  ...  |

I have these 2 tables. My goal to write a query that retreives the name, the lastest date available for that person and the bonus coresponding to both that date and that name.

Here's the code I have,

SELECT NAME, date_max, BONUS FROM 
((SELECT A.ID, MAX(A.DATE) as date_max FROM 
table_A A JOIN table_B B 
USING (ID) 
GROUP BY ID) C 
JOIN table_B D 
ON (C.ID = D.ID AND date_max = D.DATE))

The problem is that by joining on two conditions (last line) I duplicated the ID column in the result of my inner query and now when I try to execute the outer SELECT I get the invalid identifier error. Please help me fix this

MT0
  • 143,790
  • 11
  • 59
  • 117
DaGig
  • 3
  • 1

1 Answers1

0

Using pure sql, a way would be this:

select ta.name, tb.Date, tb.Bonus
from TableA ta
  left join TableB tb
      on ta.ID = tb.ID
  left join (
    select ID, max(b.Date) as Date
    from TableA a
      join TableB b
        on a.ID = b.ID
      group by ID
    ) m
  on ta.ID = m.ID
 and tb.date = m.date   

Or most voted answer in: Fetch the row which has the Max value for a column

Using window functions, another way would be:

 select t.name, t.Date, t.Bonus,
 from (
   select ta.name, tb.Date, tb.Bonus,
     max(tb.Date) over (partition by ta.ID) as maxDate
   from TableA ta
     left join TableB tb
       on ta.ID = tb.ID
     ) t
 where t.maxDate = t.Date
James
  • 2,954
  • 2
  • 12
  • 25