2016-11-16 35 views
1

我想從持有一些設備的錯誤信息的SQL表中提取的錯誤的臨界狀態。如何保持在SQL CASE狀態下表達

條目的臨界狀態可以是A,B或C. A是略微關鍵的,B是中等嚴重和C是非常關鍵的。

有可能是每一個設備的多個條目。例如,如下表所示。

DId  | Critical Status  
Device1 | A 
Device2 | B 
Device1 | C 
Device3 | C 
Device1 | B 
Device4 | A 

現在我想獲得對每個設備的最大臨界狀態。從上面的示例表中,我想要以下結果

DId  | Critical Status  
Device1 | C 
Device2 | B 
Device3 | C 
Device4 | A 

設備ID不必按順序排列。任何訂單都可以。我只想對每個設備獲得最關鍵的價值。

如何我寫爲MySQL的使用SQL查詢?

編輯 - 我看到了一些答案,這表明使用MAX功能,假設關鍵地位是按字母順序排列。我確實得到了這些答案。但是,如果字符串不同,是否有辦法實現結果? IE瀏覽器 - 打開,INPROGRESS和解決,而不是C,B,A

+0

我想'SELECT MAX(狀態)'會在你的情況 – Fabio

+0

工作是代碼真的A,B,C或這僅僅是你做了簡化嗎? –

+0

@DuduMarkovitz是的,這是我做過的簡化。我的不好,不應該那樣做。如果A,B,C被一些隨機字符串替換,是否有辦法實現這一點? –

回答

1
select  DId 
      ,elt(max(field (CriticalStatus,'Open','InProgress','Resolved')),'Open','InProgress','Resolved')    

from  MyTable 

group by DId 

select  DId 
      ,substring(max(concat(case CriticalStatus when 'Open' then '1' when 'InProgress' then '2' when 'Resolved' then '3' end ,CriticalStatus)),2)  

from  MyTable 

group by DId 

select  DId 
      ,case max(case CriticalStatus when 'Open' then 1 when 'InProgress' then 2 when 'Resolved' then 3 end) 
       when 1 then 'Open' 
       when 2 then 'InProgress' 
       when 3 then 'Resolved' 
      end 

from  MyTable 

group by DId 
+0

第三個是最好的,因爲它使用標準的SQL。 –

+0

乾淨的答案。正是我所期望的。我最喜歡的是答案的簡單性 –

1

如果字符是 「爲了」,只是用自己的數值:

SELECT ID, 
     MAX(critical_status) status 
FROM table 
GROUP BY ID 
ORDER by status desc; 

塞爾吉奧

+1

爲什麼不能簡單地用'MAX(critical_status)'?它會使A,B,C匹配所需的結果。 –

+0

(1)這不是所要求的結果(2)如果編碼包含有序的字母字符,那麼所有你需要的是max(critical_status) –

+0

Hi Dudu,你是對的..它是返回char值.. thx [編輯] –

2

爲了你的優先地位,這似乎方面字母順序排列,這樣你就可以這樣寫:

SELECT DId, MAX(CriticalStatus) 
FROM yourtable 
GROUP BY DId 

SqlFiddle

2

試試下面的查詢

SELECT ID, 
     CASE 
     WHEN status = 1 THEN 'Resolved' 
     WHEN status = 2 THEN 'InProgress' 
     WHEN status = 3 THEN 'Open' 
     END critical_status 
FROM(
    SELECT ID, 
     MAX(CASE 
      WHEN Critical_Status = 'Resolved' 
      THEN 1 
      WHEN Critical_Status = 'InProgress' 
      THEN 2 
      WHEN Critical_Status = 'Open' 
      THEN 3 
      END) status 
    FROM table1 
    GROUP BY ID) T1 

希望這應該解決您的問題。