2017-07-05 52 views
2

這是表:SQL條件選擇與/ while循環

Order_ID|Priority|Status 
A  |3  |Normal 
A  |4  |Urgent 
B  |6  |Urgent 
B  |7  |Normal 
C  |8  |Normal 
C  |9  |Urgent 

如何選擇Order_ID上和狀態,其中一個行的首要任務是爲ID更高?例如,在這種情況下,查詢的輸出給出了上述數據應該是:

A - Urgent 
B - Normal 
C - Urgent 
+0

爲了將來的參考,我建議,對於這些類型的問題,您提供複製+粘貼DDL和DML語句來激發更少的時間來創建更好的答案。例如,如果存在唯一約束(order_id,priority),那麼解決方案可能比如果存在唯一約束(order_id,priority,create_date)更容易創建(即,如果存在指示優先級改變的create_date ),或者沒有唯一的約束。 – jeff6times7

回答

5

一種方式來做到這一點是這樣的:

select order_id || ' - ' || status 
from (
    select order_id, priority, status, 
      rank() over (partition by order_id order by priority desc) ranking 
    from table 
) 
where ranking = 1; 
+1

我非常喜歡開窗功能。他們使這樣的事情變得更容易。對於OP,還要注意,如果這個解決方案(rank())具有2個相同的最高優先級,它將爲一個order_id返回多個行。 – Shawn

+0

@Shawn這就是爲什麼我喜歡向OP提出這些類型的問題的建議,以提供複製+粘貼DDL和DML語句來激發更少的時間創建更好的答案。 – jeff6times7

0

另一種方式與SQL做到這一點會是簡單地得到MAX(Priority)每個Order_ID上,並使用子查詢連接回該表:

SELECT x.ORDER_ID + ' - ' + x.Status AS [Output], 
    x.Priority , 
    x.Status 
FROM (SELECT Order_ID AS Order_ID , 
       MAX(Priority) AS [Priority] 
     FROM  @your_table 
     GROUP BY ORDER_ID 
    ) t 
    JOIN @your_table x ON x.Order_ID = t.Order_ID 
         AND x.[Priority] = t.[Priority]; 

哪裏@your_table是無論你的表的名稱是。

這是查詢的輸出:

Output  Priority Status 
A - Urgent 4   Urgent 
B - Normal 7   Normal 
C - Urgent 9   Urgent 
1

具有最高優先級的記錄 - >>存在具有更高優先級


SELECT * 
FROM order_status o 
WHERE NOT EXISTS(
     SELECT * 
     FROM order_status x 
     WHERE x.order_id = o.order_id 
     AND x.priority > o.priority 
     ) 
     ; 
+0

這需要在表格上進行兩次傳遞,如果業務任務的執行配置文件在貢獻者底部顯示此查詢以查看總響應時間,則這不會有什麼大不了。 – jeff6times7

+0

生成的計劃依賴於查詢計劃器/生成器以及索引的可用性。 – wildplasser

0
select Order_ID || ' - ' || (
    select top 1 Status 
    from priorities as p2 
    where p1.Order_ID = p2.Order_ID 
    order by p2.Priority desc) 
from priorities as p1 
group by Order_ID 
order by max(Priority) 

沒有記錄退貨

A - Urgent 
B - Normal 
C - Urgent