Проверьте наличие нескольких различных случаев по группам - PullRequest
0 голосов
/ 13 сентября 2018

Входные данные

   Some_Table
   ST_Field1   ST_Field2
   Apple       A
   Apple       A
   Apple       D
   Orange      D
   Orange      E
   Orange      Z
   Pear        D
   Pear        G 
   Pear        C

   Reference_Table
   RT_Field1   RT_Field2
   1           A
   1           B
   1           C
   2           D
   2           E
   2           F
   3           G

Ожидаемый результат:

   ST_Field1   ST_Field2
   Orange      D
   Orange      E

CREATE TABLE SOME_TABLE
  ( ST_Field1 VARCHAR(100),
    ST_Field2 VARCHAR(100)
  );

INSERT INTO SOME_TABLE VALUES ('Apple','A');
INSERT INTO SOME_TABLE VALUES ('Apple','A');
INSERT INTO SOME_TABLE VALUES ('Apple','D');
INSERT INTO SOME_TABLE VALUES ('Orange','D');
INSERT INTO SOME_TABLE VALUES ('Orange','E');
INSERT INTO SOME_TABLE VALUES ('Orange','Z');
INSERT INTO SOME_TABLE VALUES ('Pear','D');
INSERT INTO SOME_TABLE VALUES ('Pear','G');
INSERT INTO SOME_TABLE VALUES ('Pear','C');

CREATE TABLE REFERENCE_TABLE
  ( RT_Field1 INTEGER,
    RT_Field2 VARCHAR(100)
  );

INSERT INTO REFERENCE_TABLE VALUES (1,'A');
INSERT INTO REFERENCE_TABLE VALUES (1,'B');
INSERT INTO REFERENCE_TABLE VALUES (1,'C');
INSERT INTO REFERENCE_TABLE VALUES (2,'D');
INSERT INTO REFERENCE_TABLE VALUES (2,'E');
INSERT INTO REFERENCE_TABLE VALUES (2,'F');
INSERT INTO REFERENCE_TABLE VALUES (3,'G');

Можно предположить, что RT_Field2 уникален.

Я хочу получить записи отSome_Table, которые имеют несколько различных значений от RT_Field2, группируются по RT_Field1, по ST_Field1.

Таким образом, из справочной таблицы {A, B, C} группировка.Я хочу посмотреть, если для данного ST_Field1 я вижу либо {A, B}; {B, c}, {A, C}.Я не вижу A и C, но через Apple и Pear.

Единственный успех - Orange, где я ищу {D, E}, {D, F} или {E, F} и найдите D и E для Orange.

У меня есть:

WITH DUP_VALUES_RTF2 AS
  ( SELECT * 
      FROM (SELECT DST.ST_Field1,
                   DST.ST_Field2,
                   COUNT(1) OVER (PARTITION BY RT.RT_Field1) cnt_RTF1
              FROM (SELECT DISTINCT
                           ST_Field1,
                           ST_Field2
                      FROM Some_Table
                   ) DST
             INNER
              JOIN REFERENCE_TABLE RT
                ON DST.ST_Field2 = RT.RT_Field2
           ) TMP
     WHERE cnt_RTF1 > 1
  )
SELECT * 
  FROM SOME_TABLE ST
 WHERE EXISTS
         ( SELECT 1
             FROM DUP_VALUES_RTF2 DVR
            WHERE ST.ST_Field1 = DVR.ST_Field1
              AND ST.ST_Field2 = DVR.ST_Field2
         );  

Который даже близко не подходит, потому что он вообще неправильно обрабатывает группировкуи действительно ужасно.Может быть, я просто умру с ума после 5 вечера.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Если я правильно понимаю, вы хотите сопоставить st_field1 и rt_field1, ища дубликаты в rt_field2. Для этого вы можете использовать оконные функции:

select s.*
from (select s.*, rt.rt_field1, rt.rt_field2,
             min(rt.rt_field2) over (partition by s.st_field1, r.rt_field1) as min_rt2,
             max(rt.rt_field2) over (partition by s.st_field1, r.rt_field1) as max_rt2             
      from sometable s join
           reference_table r
           on s.st_field2 = r.rt_field2
     ) s
where min_rt2 <> max_rt2;
0 голосов
/ 13 сентября 2018

вы можете попробовать что-то вроде ниже

; with distinctSet as 
(select distinct s.*,RT_Field1 from SOME_TABLE s join REFERENCE_TABLE r on s.ST_Field2=r.RT_Field2
)
, 
uniqueSet as 
(
select RT_Field1,ST_Field1 
from distinctSet
group by RT_Field1,ST_Field1
having count(1)>1
),
resultSet as 
(
select
distinct 
s.*
from SOME_TABLE s 
join REFERENCE_TABLE r 
on s.ST_Field2=r.RT_Field2
join uniqueSet u
on u.RT_Field1=r.RT_Field1
and u.ST_Field1=s.ST_Field1
)
select * from resultSet
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...