I have this dataset of product sales:
PRODUCT SALES
YearMonth Client_ID
202103 1
202008 1
201807 1
202101 2
202011 2
201802 2
201801 2
And I have this dataset of Financial Sales
FINANCIAL SALES
YearMonth Client_ID
202104 1
202009 1
201607 1
202104 2
202012 2
201512 2
I want to create a column in the dataset PRODUCT SALES named “If_financial_sales” where it takes the value 1 when the client in product sales bougth a financial product in the last 24 months, and 0 otherwise. Those 24 months are counting from the YearMonth of PRODUCT SALES (not from today). For example, If the client 2 on 201802 from product sales date bought a financial sale in the last 24 months (from 201801 to 201601 = 24 months) then If_financial_sales = 1 for this client in that month.
Output expected:
PRODUCT SALES
YearMonth Client_ID If_Financial_Sales
202103 1 1
202008 1 0
201807 1 1
202101 2 1
202011 2 0
201802 2 0
201801 2 1
I have been trying this with ROW_NUMBER()
, but it seems to work better with some joins I have seen that uses equality operatos on the keys when joining (>
, <
, =
) but I don’t know what their name is neither how to use them.
Advertisement
Answer
Try this:
-- Auxiliary data for testing purposes
with product_sales (YearMonth, Client_ID) as (
select 202103, 1 from dual union all
select 202008, 1 from dual union all
select 201807, 1 from dual union all
select 202101, 2 from dual union all
select 202011, 2 from dual union all
select 201802, 2 from dual union all
select 201801, 2 from dual),
financial_sales (YearMonth, Client_ID) as (
select 202104, 1 from dual union all
select 202009, 1 from dual union all
select 201607, 1 from dual union all
select 202104, 2 from dual union all
select 202012, 2 from dual union all
select 201512, 2 from dual)
-- Actual query
SELECT
ps.*,
CASE
WHEN EXISTS (
SELECT
1
FROM
financial_sales fs
WHERE
to_date(fs.yearmonth, 'YYYYMM') < to_date(ps.yearmonth, 'YYYYMM')
AND to_date(fs.yearmonth, 'YYYYMM') >= to_date(ps.yearmonth, 'YYYYMM') - INTERVAL '25' MONTH
AND fs.client_id = ps.client_id
) THEN
1
ELSE
0
END if_financial_sales
FROM
product_sales ps;
Output:
YearMonth Client_ID If_financial_sales
----------------------
202103 1 1
202008 1 0
201807 1 1
202101 2 1
202011 2 0
201802 2 0
201801 2 1