I have a table with the following values
date | customer name | material |
---|---|---|
9/1/2020 | A | A1 |
8/1/2019 | A | A2 |
8/1/2018 | A | A2 |
9/2/2020 | B | A1 |
9/2/2019 | B | A2 |
9/2/2017 | B | A2 |
So the output should be something like, if I could see a customer with a material, who has an entry in the past 3 years, then the status flag should be Yes, other wise the status flag should be no.
date | customer name | material | status |
---|---|---|---|
9/1/2020 | A | A1 | No |
8/1/2019 | A | A2 | Yes |
8/1/2018 | A | A2 | No |
9/2/2020 | B | A1 | No |
9/2/2019 | B | A2 | Yes |
9/2/2017 | B | A2 | No |
I was thinking about counting the given occurences of a customer/material pair, for the past 3 years, and check the count to set the status flag. But confused how I would use windowing function?
select customer_name, material, count(*) from table where datediff(year, date, current_date) <=3 group by customer_name, material
and then join this table, but I feel this approach is wrong as it does not account for rolling status.
Thank you!
Advertisement
Answer
Use window functions. Probably the simplest is lag()
:
select t.*, (case when lag(date) over (partition by customer, material order by date) >= date - interval '3 year' then 'Yes' else 'No' end) as flag from t