Как получить другое «помеченное» значение, если также существует другая запись / значение для этого конкретного - PullRequest
0 голосов
/ 16 октября 2018

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

Value            Brand             Hour                  Code      Type
  5                G           10/16/2018 01:00 AM      'ABC'         A
 NULL              G           10/16/2018 01:00 AM      'MIS'         A
  12               G           10/16/2018 02:00 AM      'ABC'         A
  2                B           10/16/2018 01:00 AM      'ABC'         B
 NULL              B           10/16/2018 01:00 AM      'MIS'         B

Что мне нужно, чтобы при наличии двух (или более) записей я хотел, чтобы создаваемое мной представление получало значение NULL с кодом данных <> 'ABC ', но все еще имеет data_code =' ABC '(как показано ниже)

Value            Brand             Hour                 Code       Type
 NULL              G           10/16/2018 01:00 AM      'ABC'         A
  12               G           10/16/2018 02:00 AM      'ABC'         A
 NULL              B           10/16/2018 01:00 AM      'ABC'         B

Я пробовал следующее, но не уверен, что это правильно: (есть ли лучший способ сделать это?)

CREATE OR REPLACE VIEW 'VIEW_1' as
select CASE WHEN Data_code <> 'ABC'
            THEN select MIN(value_nb)
                   from Table_1
                   group by Brand, Hour, Type
            ELSE value
             END            VALUE
     , Brand
     , Hour
     , 'ABC'
     , Type
  from Table_1;

1 Ответ

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

Чтобы суммировать комментарии, вам нужны строки 'ABC', в которых нет соответствующей строки 'MIS' (на основе комбинации бренда / часа / типа);плюс строки «MIS», которые также имеют совпадающую «ABC», но с измененным кодом на «ABC» ...

Вы можете объединить два запроса, чтобы получить эти подмножества строк:

select value
     , brand
     , hour
     , code
     , type
  from table_1 t1
  where code = 'ABC'
  and not exists (
    select *
      from table_1 t1_sub
     where t1_sub.brand = t1.brand
       and t1_sub.hour = t1.hour
       and t1_sub.type = t1.type
       and t1_sub.code = 'MIS'
  )
union all
select value
     , brand
     , hour
     , 'ABC'
     , type
  from table_1 t1
  where code = 'MIS'
  and exists (
    select *
      from table_1 t1_sub
     where t1_sub.brand = t1.brand
       and t1_sub.hour = t1.hour
       and t1_sub.type = t1.type
       and t1_sub.code = 'ABC'
  );

     VALUE BRAND HOUR                CODE TYPE
---------- ----- ------------------- ---- ----
        12 G     2018-10-16 02:00:00 ABC  A   
           G     2018-10-16 01:00:00 ABC  A   
           B     2018-10-16 01:00:00 ABC  B   

или вторая ветвь предположительно может быть упрощена, если для каждого MIS всегда должен быть соответствующий «ABC»:

select value
     , brand
     , hour
     , code
     , type
  from table_1 t1
  where code = 'ABC'
  and not exists (
    select *
      from table_1 t1_sub
     where t1_sub.brand = t1.brand
       and t1_sub.hour = t1.hour
       and t1_sub.type = t1.type
       and t1_sub.code = 'MIS'
  )
union all
select value
     , brand
     , hour
     , 'ABC'
     , type
  from table_1 t1
  where code = 'MIS';

     VALUE BRAND HOUR                CODE TYPE
---------- ----- ------------------- ---- ----
        12 G     2018-10-16 02:00:00 ABC  A   
           G     2018-10-16 01:00:00 ABC  A   
           B     2018-10-16 01:00:00 ABC  B   

Вы также можете сделать это одним ударом по столу.используя аналитические функции различными способами;это только один пример, в котором нулевое значение имеет приоритет над ненулевым:

select value
     , brand
     , hour
     , code
     , type
  from (
    select value
         , brand
         , hour
         , 'ABC' as code
         , type
         , row_number() over (partition by brand, hour, type order by value nulls first) as rn
      from table_1
  )
 where rn = 1;

     VALUE BRAND HOUR                CODE TYPE
---------- ----- ------------------- ---- ----
           B     2018-10-16 01:00:00 ABC  B   
           G     2018-10-16 01:00:00 ABC  A   
        12 G     2018-10-16 02:00:00 ABC  A   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...