Создание дубликатов с использованием Union с фильтром - PullRequest
0 голосов
/ 26 марта 2019

Я хочу дублировать мои данные, но изменить одно значение в одном столбце. Например, мне нужно, чтобы мои данные выглядели так на каждый (до) и (с) ..

  to    from    vehicle size    l   h
 FCS011 FCS416  6025         0.1       0.3
 FCS011 FCS416  6020         0.1    0.3
 FCS011 FCS416  6010         0.1    0.3
 FCS011 FCS416  6015         0.1    0.3

Теперь для некоторых наборов (до) и (из) у меня есть данные только с размером транспортного средства 6010 и 6015, а для некоторых у меня есть данные только для 6025 и 6020. Мне нужно продублировать значения для данного набора, который отсутствует данные для одного или другого набора.

Мои данные в настоящее время выглядят так для некоторых наборов (market_to, market_from)

 to     from    vehicle size    l     h
 FCS010 FCS416  6025         0.1       0.3
 FCS010 FCS416  6020         0.1       0.3
 FCS012 FCS416  6010         0.1       0.3
 FCS012 FCS416  6015         0.1       0.3

Этот набор данных должен выглядеть следующим образом:

      to      from  vehicle size    l       h
      FCS010    FCS416  6025         0.1       0.3
      FCS010    FCS416  6020         0.1       0.3
      FCS010    FCS416  6010         0.1       0.3
      FCS010    FCS416  6015         0.1       0.3
      FCS012    FCS416  6010         0.1       0.3
      FCS012    FCS416  6015         0.1       0.3
      FCS012    FCS416  6020         0.1       0.3
      FCS012    FCS416  6025         0.1       0.3

Так что я хотел объединить все, чтобы захватить другие значения, но я не уверен, как захватить логику того или другого. Ниже мой запрос, что я сделал объединение для создания дополнительных строк ..

 create table PA_FCS_temp
 as
 select 
 MARKET_FROM ,
 MARKET_TO ,
 VEHICLE_CLASS,
 l,
 h
 from PA_FCS
 UNION ALL
 select MARKET_FROM ,
 MARKET_TO ,
 decode(VEHICLE_CLASS, '6020', '6025', '6010', '6015') as VEHICLE_CLASS,        
 l,
 h

 from PA_FCS
 VEHICLE_CLASS in ('6020', '6010')

 ORDER BY MARKET_FROM, MARKET_TO;

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Вы можете мультиплексировать записи только с 5 (6015, 6025), используя модульную логику с перекрестное соединение как

select * from t where mod(vehicle_size,10)=0
union all
select t1.* 
  from t t1 cross join t t2 
 where mod(t1.vehicle_size,5)=0
   and mod(t1.vehicle_size,10)!=0

Демо

0 голосов
/ 27 марта 2019

Одним из способов решения вашей проблемы является не «дублирование строк», а «заполнение разреженных данных».

У вас есть список известных размеров автомобилей: 6010, 6015, 6020 и6025. У вас есть наборы данных, заданные market_to и market_from, где каждый набор может содержать не все известные размеры автомобиля.Вы хотите заполнить разреженные данные таким образом, чтобы каждый набор содержал каждый известный размер транспортного средства.

Хорошим инструментом SQL в Oracle для заполнения разреженных данных является «секционированное» внешнее соединение.Вот как это будет работать для вашего запроса:

Настройка

CREATE TABLE market_data (  
  market_to varchar2(6), 
  market_from varchar2(6), 
  vehicle_size number(4),
  l number,
  h number);

INSERT INTO market_data
 SELECT 'FCS010','FCS416',6025,  0.1, 0.3 FROM DUAL UNION ALL
 SELECT 'FCS010','FCS416',6020,  0.1, 0.3 FROM DUAL UNION ALL
 SELECT 'FCS012','FCS416',6010,  0.1, 0.3 FROM DUAL UNION ALL
 SELECT 'FCS012','FCS416',6015,  0.1, 0.3 FROM DUAL ;

 COMMIT;

Разделенный запрос внешнего соединения

(примечание: если у вас есть таблица с известными размерами автомобиля, выможете использовать это и опустить предложение WITH.)

with vehicle_sizes ( vehicle_size ) AS 
  ( SELECT column_value FROM TABLE(sys.odcinumberlist(6010, 6015, 6020, 6025)) )
select md.market_from, 
       md.market_to,
       vs.vehicle_size,
       nvl(md.l, min(md.l) over ( partition by md.market_from, md.market_to )) l,
       nvl(md.h, min(md.h) over ( partition by md.market_from, md.market_to )) h
from market_data md partition by (md.market_to, md.market_from) 
right outer join vehicle_sizes vs on vs.vehicle_size = md.vehicle_size;
+-------------+-----------+--------------+-----+-----+
| MARKET_FROM | MARKET_TO | VEHICLE_SIZE |  L  |  H  |
+-------------+-----------+--------------+-----+-----+
| FCS416      | FCS010    |         6010 | 0.1 | 0.3 |
| FCS416      | FCS010    |         6015 | 0.1 | 0.3 |
| FCS416      | FCS010    |         6020 | 0.1 | 0.3 |
| FCS416      | FCS010    |         6025 | 0.1 | 0.3 |
| FCS416      | FCS012    |         6010 | 0.1 | 0.3 |
| FCS416      | FCS012    |         6015 | 0.1 | 0.3 |
| FCS416      | FCS012    |         6020 | 0.1 | 0.3 |
| FCS416      | FCS012    |         6025 | 0.1 | 0.3 |
+-------------+-----------+--------------+-----+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...