[英]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,我们需要遵循三个步骤:
我可以为 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
如果我理解,您可以使用 CROSS APLY,
https://www.sqlshack.com/es/la-diferencia-entre-cross-apply-y-outer-apply-en-sql-server/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.