Подходим один ряд к двум без замены - PullRequest
0 голосов
/ 03 ноября 2019

Я хочу сопоставить каждого человека, который отправляет заказ (YES), с двумя людьми, которые не отправили заказ (NO) и имеют одинаковые gender и age. Если человек совпадает с человеком x, x не может быть в паре с кем-либо еще. И если у человека x есть 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

Мне удалось выбрать два идентификатора из людей, которые не заказывали и соответствовалиих с одним человеком, который сделал заказ. Но я не знаю, как включить условие «если у человека, который не заказал, есть 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
...