SQL - 加入 window

SQL - Join with window

我有这个产品销售数据集:

PRODUCT SALES   
YearMonth   Client_ID   
202103             1    
202008             1    
201807             1    
202101             2    
202011             2    
201802             2    
201801             2    

我有这个金融销售数据集

FINANCIAL SALES 
YearMonth   Client_ID
202104      1
202009      1
201607      1
202104      2
202012      2
201512      2

我想在名为“If_financial_sales”的数据集 PRODUCT SALES 中创建一个列,当产品销售客户在过去 24 个月内购买了金融产品时,它的值为 1,否则为 0。这 24 个月是从 PRODUCT SALES 的 YearMonth 开始计算的(不是从今天开始)。例如,如果客户 2 在产品销售日期的 201802 购买了最近 24 个月(从 201801 到 201601 = 24 个月)的金融销售,则 If_financial_sales = 1 此客户在该月内。

预期输出:

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

我一直在用 ROW_NUMBER() 尝试这个,但它似乎与我看到的一些连接一起工作更好,这些连接在连接时在键上使用相等运算符(>< ,=) 但不知道叫什么名字, 也不知道怎么用.

试试这个:

-- 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;

输出:

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