Нужно добавить столбец, который содержит «строку», если любое из значений в определенном столбце из другой таблицы содержит ту же «строку» - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь изменить запрос, чтобы добавить столбец, значение которого должно быть «сбой», если какое-либо из значений с таким же идентификатором из другой таблицы имеет «сбой» в определенном столбце.

Там3 таблицы, таблица 1 содержит 4 строки (категории) финансовых данных (фиксированный доход, акции, рейтинги, листинги) с их systemId.

Таблица 2 содержит более 1000 строк финансовых данных, которые могут подпадать под любую изэти 4 категории.В таблице 2 также есть строка с именем STATUS , которая может содержать значение: «выполняется», «отказывает» или «находится в режиме ожидания».

Таблица 3 содержит общую информацию о наборах данных и имеет значения id и systemId .

Я хочу добавить столбец вTABLE1 (категории), называемый STATE, который содержит «fail» или «standy», если какая-либо из строк с одинаковым systemId содержит значение «fail» или «standby», и показывает только «running», если все строки с одинаковым systemId (таблица2) имеет "выполняется" в своем столбце состояния (таблица2).


ТАБЛИЦА 1

         category             systemId      ???STATE??? 

         fixed income         1                 ?
         listings             2                 ?
         ratings              3                 ?
         equities             4                 ?

ТАБЛИЦА 2

  ID                    STATUS

  45421158              failed 
  2121158              running  
  9464548888             running
  454548888             standby
  9948158              running
  78748158              running

ТАБЛИЦА3

  id                    **systemId**
  45421158              1
  98721158              1
  454548888             2
  6888888             2
  78748158              3
  9978158              3

Я пробовал так много разныхприсоединяется и подзапросы и не повезло.Я являюсь разработчиком пользовательского интерфейса и не имею доступа к базе данных только для примера, который запускается на Java через кеш, поэтому я не могу добавить новые таблицы или что-нибудь подобное, это должен быть 1 запрос, чтобы я мог изменить ресурс.

Заранее спасибо, ты будешь законно спасать маму!

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Вы должны присоединиться к 3 таблицам и категории group by и системному идентификатору:

select
  t1.category,
  t1.systemid,
  case
    when sum(case when t2.status = 'failed' then 1 else 0 end) > 0 then 'failed'
    when sum(case when t2.status = 'standby' then 1 else 0 end) > 0 then 'standby'
    when sum(case when t2.status = 'running' then 1 else 0 end) > 0 then 'running'
  end status
from table1 t1
left join table3 t3 on t3.systemid = t1.systemid
left join table2 t2 on t2.id = t3.id
group by t1.category, t1.systemid

Я использовал left объединений на случай, если системные идентификаторы отсутствуют в table3.Если это не так, измените на inner присоединяется

0 голосов
/ 23 июня 2019

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

Запрос выглядит следующим образом, хотя я не уверен, какие именно условия корреляции (то есть, что соответствует строкамв двух таблицах):

select c.*,
       (case when exists (select 1
                          from servicemetric.servicemetric m
                          where m.category = c.category and
                                m.status = 'fail'
             then 'fail'
             when exists (select 1
                          from servicemetric.servicemetric m
                          where m.category = c.category and
                                m.status = 'standby'
             then 'standby'
             else 'running'
        end) as imputed_status
from node.categories c;

Вы также можете реализовать логику, используя условное агрегирование:

select m.category,
       (case when sum(case when m.status = 'fail' then 1 else 0 end) > 0 then 'fail'
             when sum(case when m.status = 'standby' then 1 else 0 end) > 0 then 'standby'
             else 'running'
        end) as status
from servicemetric.servicemetric m
group by m.category;

Или даже используя coalesce():

select m.category,
       coalesce(max(case when m.status = 'fail' then status end),
                max(case when m.status = 'standby' then status end),
                max(m.status)
               )
from servicemetric.servicemetric m
group by m.category;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...