sql - 将一排匹配到两排,无需替换
问题描述
我想将每个提交订单的人 ( YES
) 与两个未提交订单的人() 匹配NO
并且具有相同的gender
and age
。如果一个人与人匹配x
,x
则不能与其他任何人配对。如果 personx
有 a contact_date
,它必须大order_date
于其原始匹配的 。
ID Gender AGE ORDER ORDER_DATE CONTACT_DATE
1 M 18 YES 10/10/2019 Nan
2 F 25 NO Nan 09/06/2016
3 M 54 YES 08/04/2018 09/08/2018
4 M 30 YES 09/11/2016 12/ 12/2016
我设法从没有订购的人中选择了两个 ID,并将它们与一个订购的人匹配。但我不知道如何包含条件“如果一个没有订购的人有一个contact_date
,它应该大于order_date
它的匹配”
CREATE TABLE 1st_match AS (
SELECT b*.
FROM (
SELECT aa.*, ROW NUMBER () OVER(PARTITION BY AGE, GENDER ORDER BY ID1 ASC) rn
FROM (diag_orderedcostumer aa) a,
SELECT bb.*, ROW NUMBER()OVER(PARTITION BY AGE, GENDER ORDER BY ID2 ASC) rn
FROM (diag_notorderedcostumer bb) b
WHERE a.gender = b.gender
AND a.rn = b.rn
AND a.AGE = b.AGE
) WITH DATA;
CREATE TABLE 2nd_match AS (
SELECT b*.
FROM (
SEL aa.*, ROW NUMBER () OVER(PARTITION BY AGE, GENDER ORDER BY ID1 ASC) rn
FROM (diag_orderedcostumer aa) a,
SEL bb.*, ROW NUMBER()OVER(PARTITION BY AGE, GENDER ORDER BY ID2 ASC) rn
FROM (diag_notorderedcostumer bb
WHERE ID2 NOT IN (SEL DISTINCT ID2 FROM 1st_match)
) b
WHERE a.gender = b.gender
AND a.rn = b.rn
AND a.AGE = b.AGE
) WITH DATA;
CREATE TABLE control final AS (
SELECT * FROM 1st_match UNION ALL
SELECT * FROM 2nd_match
) WITH DATA;
ID ID2 ID3 Gender AGE ORDER_DATE cont_date1 cont_date1 cont_date1
1 30 106 M 18 10/10/2019 Nan 11/12/3019 nan
3 400 1700 M 54 08/04/2018 09/08/2018 nan 09/12/2019
4 256 865 M 30 09/11/2016 12/ 12/2016 1/1/2017 05/12/2018
解决方案
推荐阅读
- c++ - 在 C++20 中,如果宏是#undef'd,然后又是#define'd,它是否被认为是“活动的”?
- python - 使用 df.join() 时获取指示符列
- android - com.airbnb.epoxy.IllegalEpoxyUsage:在添加模型之前,您必须在模型上设置一个 id
- docker - 从 GCP AI Platform 上运行的 docker 容器内部触发 POST 请求
- scala - Apache Spark 中的异常处理
- codeigniter - 在我的 codeigniter 视图页面上显示来自同一数据库表但具有不同类别的数据(使用相同的模型和控制器)
- version-control - 如何在 Visual SourceSafe 的历史视图中查看注释?
- flutter - 如何使用 Flutter 测试 GridView 小部件的所有元素是否导航到新屏幕?
- django - 带有假主机头的 Django 服务器端请求伪造
- oracle - 如何对运行数据导入(impdp)的oracle docker容器进行健康检查