Слияние двух столов - PullRequest
       2

Слияние двух столов

2 голосов
/ 30 сентября 2019

У меня есть две таблицы, одна таблица имеет FROM_SERIAL, TO_SERIAL и TRANSACTION_DATE. И еще одна таблица имеет SERIAL_NO и ACTIVATION_DATE. Я хочу объединить обе таблицы в определенном диапазоне.

Пример:

Первая таблица

   FROM_SERIAL        TO_SERIAL       TRANSACTION_DATE
   10003000100        10003000500     22-APR-19
   10003001100        10003001300     25-MAY-19
   10005002001        10005002500     30-AUG-19

Вторая таблица

   SERIAL_NO        ACTIVATION_DATE
   10003000150      30-APR-19
   10005002300      01-OCT-19

Ожидаемая таблица

   FROM_SERIAL        TO_SERIAL       SERIAL_NO       ACTIVATION_DATE
   10003000100        10003000500     10003000150      30-APR-19
   10005002001        10005002500     10005002300      01-OCT-19

Я хочуобъединить обе таблицы в приведенном выше сценарии.

Помогите мне, пожалуйста. Код может быть Oracle или Python, это не имеет значения.

Ответы [ 4 ]

1 голос
/ 30 сентября 2019

Решение Pandas:

df = df1.assign(a=1).merge(df2.assign(a=1), on='a', how='outer')

df = df[df['SERIAL_NO'].between(df['FROM_SERIAL'], df['TO_SERIAL'])]
df = df.drop(['a','TRANSACTION_DATE'], 1)
print (df)
   FROM_SERIAL    TO_SERIAL    SERIAL_NO ACTIVATION_DATE
0  10003000100  10003000500  10003000150       30-APR-19
5  10005002001  10005002500  10005002300       01-OCT-19

Но если большие данные лучше, используйте какое-нибудь решение оракула. ​​

1 голос
/ 30 сентября 2019

Рассмотрим:

SELECT 
    t1.from_serial, 
    t1.to_serial,
    t2.serial_no,
    t2.activation_date
FROM table1 t1
INNER JOIN table2 t2 
    ON t2.serial_no >= t1.from_serial AND t2.serial_no < t1.to_serial

Вы можете корректировать неравенства по своему усмотрению. Помните, что если данный serial_no в table2 принадлежит более чем одному диапазону в table1, все они будут совпадать, и вы получите дублированные table1 записи в наборе результатов.

0 голосов
/ 30 сентября 2019

Вы также можете сделать это, используя функцию широковещания, как показано ниже. Объяснение в комментарии

df1 = pd.DataFrame([('10003000100', '10003000500', '22-APR-19'), ('10003001100', '10003001300', '25-MAY-19'), ('10005002001', '10005002500', '30-AUG-19')], columns=('FROM_SERIAL', 'TO_SERIAL', 'TRANSACTION_DATE'))
df2 = df = pd.DataFrame([('10003000150', '30-APR-19'), ('10005002300', '01-OCT-19')], columns=('SERIAL_NO', 'ACTIVATION_DATE'))


## 'df1[["FROM_SERIAL"]]'' is a column vector of size m and 'df2["SERIAL_NO"].values' is row 
## vector of size n then broad cast will result array of shape m,n which is 
## result of comparing each pair of m and n
compare = (df1[["FROM_SERIAL"]].values<df2["SERIAL_NO"].values) & (df1[["TO_SERIAL"]].values>df2["SERIAL_NO"].values)

mask = np.arange(len(df1)*len(df2)).reshape(-1, len(df2))[compare]

pd.concat([df1.iloc[mask//len(df2)].reset_index(drop=True), df2.iloc[mask%len(df2)].reset_index(drop=True)], axis=1, sort=False) 

0 голосов
/ 30 сентября 2019

Присоединяйтесь с between.

SQL> with
  2  tfirst (from_serial, to_serial) as
  3    (select 3000100, 3000500 from dual union all
  4     select 3001100, 3001300 from dual union all
  5     select 5002001, 5002500 from dual
  6    ),
  7  tsecond (serial_no, activation_date) as
  8    (select 3000150, date '2019-04-30' from dual union all
  9     select 5002300, date '2019-10-01' from dual
 10    )
 11  select a.from_serial,
 12    a.to_serial,
 13    b.serial_no,
 14    b.activation_date
 15  from tfirst a join tsecond b on b.serial_no between a.from_serial and a.to_serial;

FROM_SERIAL  TO_SERIAL  SERIAL_NO ACTIVATION
----------- ---------- ---------- ----------
    5002001    5002500    5002300 01.10.2019
    3000100    3000500    3000150 30.04.2019

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...