SQL-запрос для агрегации результатов - PullRequest
0 голосов
/ 23 мая 2018

Один сайт имеет несколько POD, и каждый POD имеет статус.Данные представлены в Таблице, как показано ниже:

Store   POD Status  
A001    S101    OK  
A001    S102    OK  
A001    S103    OK  
A002    S201    OK  
A002    S202    Critical  
A002    S203    OK  
A003    S301    OK  
A003    S302    OK  
A003    S303    Critical  
A004    S401    Warning  
A004    S402    OK  
A004    S403    OK  
A005    S501    OK  
A005    S502    OK  
A005    S503    OK  
A006    S601    OK  
A006    S602    OK  
A006    S603    Critical  
A007    S701    OK  
A007    S702    OK  
A007    S703    OK  

Рассчитайте статус сайта так, чтобы сайт сообщал о Критическом, если какой-либо из POD на сайте имеет Критический статус, иначе, если должен сообщать Предупреждение, если любойиз POD на сайте есть предупреждение,

Expected Output  
A001 OK  
A002 Critical  
A003 Critical  
A004 Warning  
A005 OK  
A006 Critical  
A007 OK  

Каким должен быть SQL-запрос, чтобы получить ожидаемый результат?

Ответы [ 3 ]

0 голосов
/ 23 мая 2018
SELECT
  store,
  ELT(
    MAX(CASE status WHEN 'OK'       THEN 1
                    WHEN 'Warning'  THEN 2
                    WHEN 'Critical' THEN 3
                                    ELSE 4 END),
    'OK',
    'Warning',
    'Critical',
    'Unknown'
  )
    AS final_status
FROM
  yourTable
GROUP BY
  store
0 голосов
/ 23 мая 2018

Вы также можете использовать корреляцию подход:

select Store, (select t1.Status
               from table t1
               where t1.Store = t.Store
               order by (case when t1.Status = 'Critical' 
                              then 1  
                              when t1.Status = 'Warning' 
                              then 2
                              when t1.Status = 'OK' 
                              then 3
                         end)
                limit 1 
               ) as Status  
from table t
group by Store; 
0 голосов
/ 23 мая 2018

Вы можете использовать ELT и conditional aggregation:

SELECT Store, ELT(MAX(CASE WHEN Status='OK' THEN 1
                       WHEN status='Warning' THEN 2
                       WHEN status='Critical' THEN 3 END)
            , 'OK', 'Warning', 'Critical') AS output
FROM tab
GROUP BY Store;

DBFiddle Demo

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