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
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
一種方式來做到這一點是這樣的:
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;
我非常喜歡開窗功能。他們使這樣的事情變得更容易。對於OP,還要注意,如果這個解決方案(rank())具有2個相同的最高優先級,它將爲一個order_id返回多個行。 – Shawn
@Shawn這就是爲什麼我喜歡向OP提出這些類型的問題的建議,以提供複製+粘貼DDL和DML語句來激發更少的時間創建更好的答案。 – jeff6times7
另一種方式與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
具有最高優先級的記錄 - >>存在具有更高優先級
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
)
;
這需要在表格上進行兩次傳遞,如果業務任務的執行配置文件在貢獻者底部顯示此查詢以查看總響應時間,則這不會有什麼大不了。 – jeff6times7
生成的計劃依賴於查詢計劃器/生成器以及索引的可用性。 – wildplasser
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
爲了將來的參考,我建議,對於這些類型的問題,您提供複製+粘貼DDL和DML語句來激發更少的時間來創建更好的答案。例如,如果存在唯一約束(order_id,priority),那麼解決方案可能比如果存在唯一約束(order_id,priority,create_date)更容易創建(即,如果存在指示優先級改變的create_date ),或者沒有唯一的約束。 – jeff6times7