как сделать таблицу 1 похожей на таблицу 2?Я пробовал группировать по функциям, но я не знаю, как сравнить одну запись с другой - PullRequest
0 голосов
/ 16 октября 2018

Я хочу запрос на выборку, который делает таблицу 1 похожей на таблицу 2. Это означает, что я хочу запрос, который даст мне записи, которые соответствуют в mem_no, join_date, end_date, product_id, но не совпадают в Indicator.Я рассматриваю комбинацию индикаторов (PR против SN) и (SR и SN).Это означает, что я хочу записи, которые имеют такие же mem_no, join_date, end_date, product_id, но имеют «PR» в качестве индикатора и «SN» в следующий раз или «SR» в качестве индикатора или «SN» в следующий раз.

Table 1:

mem_no  join_date   end_date    product_id  Indicator
1   2/11/2018   12/12/2018  1   PR
2   2/11/2018   12/12/2018  1   PR
2   2/11/2018   12/12/2018  1   SN
3   3/5/2017    12/12/2018  8   SR
3   3/5/2017    12/12/2018  8   SN
4   3/5/2017    12/12/2018  86  PR
4   3/5/2017    12/12/2018  86  PR
4   3/5/2017    12/12/2018  87  SR
4   3/5/2017    12/12/2018  87  SN


Table 2:
mem_no  join_date   end_date    product_id  Indicator
2   2/11/2018   12/12/2018  1   PR
2   2/11/2018   12/12/2018  1   SN
4   3/5/2017    12/12/2018  87  SR
4   3/5/2017    12/12/2018  87  SN

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Аналитические функции - ваши друзья

with data as (
select 
 mem_no, join_date, end_date, product_id, Indicator,
count(*) over (partition by mem_no, join_date, end_date, product_id) as cnt,
listagg(Indicator, ',') WITHIN GROUP (ORDER BY Indicator)
  over (partition by mem_no, join_date, end_date, product_id) Indicator_lst  
from tab)
select mem_no, join_date, end_date, product_id, Indicator
from data
where cnt = 2 and
Indicator_lst in ('PR,SN','SN,SR');

CTO вычисляет количество строк с одинаковыми mem_no, join_date, end_date, product_id .listagg объединяет показатели.Основной запрос фильтрует два желаемых условия.

На ваших данных образца вы получаете

MEM_NO JOIN_DATE           END_DATE            PRODUCT_ID INDICATOR
---------- ------------------- ------------------- ---------- ---------
     2 02-11-2018 00:00:00 12-12-2018 00:00:00          1 PR        
     2 02-11-2018 00:00:00 12-12-2018 00:00:00          1 SN        
     3 03-05-2017 00:00:00 12-12-2018 00:00:00          8 SN        
     3 03-05-2017 00:00:00 12-12-2018 00:00:00          8 SR        
     4 03-05-2017 00:00:00 12-12-2018 00:00:00         87 SN        
     4 03-05-2017 00:00:00 12-12-2018 00:00:00         87 SR 
0 голосов
/ 16 октября 2018

Возможно, вы хотите EXISTS:

select t.*
from table1 t1
where Indicator in ('PR', 'SN', 'SR') and
      exists (select 1 
              from table1 t11 
              where t11.mem_no = t.mem_no and t11.join_date = t.join_date and t11.end_date = t1.end_date and 
                    t11.product_id = t.product_id and t11.Indicator <> t.Indicator
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...