2017-07-05 3 views
2

これは、テーブルである間:SQLループ

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

は、どのように私は、行の優先順位は、そのIDの方が高いORDER_IDとステータスを選択しますか?たとえば、この場合には、上記のデータ特定のクエリの出力は次のようになります。SQLしまうと、これを行うに

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; 
+0

今後の参考として、これらのタイプの質問に対して、コピー+ペーストが可能なDDLおよびDMLステートメントを提供して、作成時間の短縮されたより良い回答を促すことをお勧めします。たとえば、一意制約(order_id、priority)がある場合、一意制約(order_id、priority、create_date)がある場合(つまり、優先順位が変更されたときを示すcreate_dateがあった場合) )、または一意の制約がありません。 – jeff6times7

答えて

5

一つの方法は、このようなものです単に各ORDER_IDについてMAX(Priority)を取得し、副選択を使用して、そのテーブルに戻って参加すること:@your_tableはあなたのテーブルの名前が何であれです

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]; 

これは、クエリの出力です:優先順位が最も高い

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

私は窓関数をとても好きです。彼らはこのようなことをもっと楽にします。またOPに、この解決策(rank())は、同じ優先度の2がある場合、order_idに複数の行を返します。 – Shawn

+0

@Shawnこれは、コピー+貼り付け可能なDDLとDMLステートメントを提供するために、これらのタイプの質問についてOPに提案して、作成時間を短縮したより良い回答を促す理由です。 – jeff6times7

0

もう一つの方法:それを行うには

A - Urgent 
B - Normal 
C - 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

これは、テーブルに2回のパスを必要とします。ビジネス・タスクの実行のプロファイルが、合計応答時間のコントリビュータの最下部でこの問合せを表示する場合、大したことではありません。 – 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