дублирование похожих данных на основе нескольких полей - PullRequest
0 голосов
/ 17 апреля 2020

Я хотел бы создать таблицу возможных повторяющихся записей из исходной таблицы, однако данные основаны на двух разных атрибутах, и они должны объединяться только в одном и том же идентификаторе группировки. Также в некоторых случаях данные не выглядят точно так же (но сходства есть). Вот как должна выглядеть исходная таблица:

group_id| House_num | Apt    | code
----------------------------------
   45   | 1000      |  1     |  M
   45   |    1      |        |  D
   45   | 1000      |  2     |  M
   45   |    2      |        |  D
   87   | 2300      | 310    |  M
   87   | 2310      |        |  D
   87   | 2400      | 470    |  M
   87   | 2470      |        |  D

То, что я хотел бы получить, - это когда все эти числа находятся в одной строке. Так что-то вроде:

new_id  |group_id|a.house_num|a.apt|a.code|b.house_num|b.apt| b.code
-------------------------------------------------------------------------
   1    |   45   |   1000   |  1   |  M   |    1      |     |  D
   2    |   45   |   1000   |  2   |  M   |    2      |     |  D  
   3    |   87   |   2300   | 310  |  M   | 2310      |     |  D
   4    |   87   |   2400   | 470  |  M   | 2470      |     |  D

Я не уверен, какой тип объединения использовать здесь; Кроме того, я не уверен, как обойти те, где a.house_num - это базовое число, a.apt - это суффиксное число, а b.housenumber - это комбинация двух. Любая помощь будет принята с благодарностью, спасибо.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020
create table t (group_id, House_num , Apt    , code) as
select   45   , 1000      ,  1     ,  'M' from dual union all
select   45   ,    1      , null   ,  'D' from dual union all
select   45   , 1000      ,  2     ,  'M' from dual union all
select   45   ,    2      , null   ,  'D' from dual union all
select   87   , 2300      , 310    ,  'M' from dual union all
select   87   , 2310      , null   ,  'D' from dual union all
select   87   , 2400      , 470    ,  'M' from dual union all
select   87   , 2470      , null   ,  'D' from dual;

select rownum new_id,
  a.GROUP_ID, a.HOUSE_NUM ahn, a.APT aapt, a.CODE acode,
              b.HOUSE_NUM bhn, b.APT bapt, b.CODE bcode
from t a
join t b
on a.group_id = b.group_id
  and a.code = 'M'
  and b.code = 'D'
  and (
    b.house_num = a.apt
    or b.house_num like '%'||a.apt
  );

NEW_ID GROUP_ID AHN  AAPT ACODE BHN BAPT BCODE
1      45       1000 1    M     1        D
2      45       1000 2    M     2        D
3      87       2300 310  M     2310     D
4      87       2400 470  M     2470     D
0 голосов
/ 17 апреля 2020

Вы можете использовать приведенный ниже ответ для получения ответа. Скрипт БД здесь

        WITH data
         AS (SELECT * FROM YOUR_TABLE),
         data2
         AS (SELECT row_number()over 
             (order by thing1,thing2)    rw,
                    d1.group_id,
                    d1.thing1 a_thing1,
                    d1.thing2 a_thing2,
                    d1.thing3 a_thing3
             FROM   data d1
             WHERE  d1.thing3 = 'M'),
         data3
         AS (SELECT row_number()over 
                   (order by thing1,thing2)    rw,
                    d1.group_id,
                    d1.thing1 b_thing1,
                    d1.thing2 b_thing2,
                    d1.thing3 b_thing3
             FROM   data d1
             WHERE  d1.thing3 = 'D')
    SELECT d2.rw New_id,
           d2.group_id,
           d2.a_thing1,
           d2.a_thing2,
           d2.a_thing3,
           d3.b_thing1,
           d3.b_thing2,
           d3.b_thing3
    FROM   data2 d2,
           data3 d3
    WHERE  d2.group_id = d3.group_id
           AND d2.rw = d3.rw 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...