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
我有这个产品销售数据集:
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