繁体   English   中英

SQL:无法加入多个 select 语句

[英]SQL: Unable to join multiple select statements

我有一张如下表:

源客户 ID 营业日期 有税收优惠 有抵押品 有贷款
BS:100037 2016-12-23 是的
BS:100056 2018-01-13 是的
BS:100037 2011-06-03 是的 是的
BS:100056 2019-10-14 是的
BS:100022 2014-09-17 是的 是的
BS:100037 2013-07-18 是的 是的
BS:100056 2016-03-19 是的 是的 是的
BS:100022 2015-04-20 是的
BS:100022 2017-08-14 是的
BS:100022 2012-11-23 是的

而我期待的 output 是

二元税收优惠 二元贷款 二元抵押品 diff_BinaryTaxBenefit diff_BinaryLoan diff_BinaryCollateral
0 0 0 NULL NULL NULL
1 0 1 1 0 1
1 0 0 0 0 -1
0 1 0 -1 1 0
0 1 1 NULL NULL NULL
1 1 0 0 -1 1
0 0 1 0 1 0
1 1 1 NULL NULL NULL
0 1 0 -1 0 1
1 0 0 0 0 0

要获得这个 output,我们需要遵循三个步骤:

  1. 按 SourceCustomerID 对数据进行分区,然后按 Source customer ID 和 Business Date 对数据进行排序
  2. 创建其他列 BinaryTaxBenefit、BinaryLoan、BinaryCollateral 逻辑是每列都有一个二进制等价物,如果列的值为“否”,它们的值为 0
  3. 最后也是最困难的部分减去(仅限 BinaryColumn)行。 但减法必须仅在组内。 所以第一个值差异始终是 NULL 和 rest 差异

我可以为 Step1 和 Step2 编写单独的 SQL 查询:

Step1:按 SourceCustomerID 对数据进行分区,然后按 Source customer ID 和 Business Date 对数据进行排序:

    SELECT 
        SourceCustomerId,
        BusinessDate,
    ROW_NUMBER() OVER(PARTITION BY SourceCustomerId ORDER BY SourceCustomerId, BusinessDate ASC) RowNumber,
        HasTaxBenifit,
        HasLoan,
        HasCollateral
    from personDetail pd

来自personDetail pd

Step2:创建其他列 BinaryTaxBenefit、BinaryLoan、BinaryCollateral:

    select * ,
           (case when HasTaxBenifit = 'Yes' then 1 else 0 end) as BinaryTaxBenefit,
           (case when HasLoan = 'Yes' then 1 else 0 end) as BinaryLoan,
           (case when HasCollateral = 'Yes' then 1 else 0 end) as BinaryCollateral
    from personDetail pd 

如何将 step1 和 Step2 合并到一个 SQL 查询中?

Step3:最后也是最困难的部分减去(仅二进制列)行:

这里是减去所有行而不考虑组,不知道如何解决这个问题

    with v as (
      select RowNumber, BinaryTaxBenefit, BinaryLoan, BinaryCollateral from personDetailTrial
    )
    select
      RowNumber,BinaryTaxBenefit, BinaryLoan, BinaryCollateral,
      BinaryTaxBenefit - lag(BinaryTaxBenefit, 1) over(order by RowNumber) as diff_BinaryTaxBenefit,
      BinaryLoan - lag(BinaryLoan, 1) over(order by RowNumber) as diff_BinaryLoan,
      BinaryCollateral - lag(BinaryCollateral, 1) over(order by RowNumber) as diff_BinaryCollateral
    from v

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM