2017-10-17 16 views
0

に選択されたレコードでレコードを並べ替え:のOracle SQL - あなたがこのようなデータを持つテーブルを持っている場合は、トップ

USER_ID   USERNAME 
    34267    mark 
    15669    john 
    61268    allan 
    87779    mary 

あなたが欲しい、これらのデータを選択し、それらを並べ替えるためには、最低の値を持つユーザーIDが上でなければなりませんでしたリストのトップへその後、残りのレコードはすべてユーザー名でアルファベット順にソートされます。だから、この場合、ジョンは最初にアレンとマリに続いて、マリをマークしなければなりません。

どのようにUNIONを使用せずにこれを行うことができますか。これは、それぞれの列に対して複数の順序がある複雑なクエリの一部に過ぎません。そう、私は本当にこのために組合を使用することはできません。このロジックを適用する必要があるのは、5番目と6番目の列の優先順位です。

order by (case when row_number() over (order by user_id) = 1 then 1 else 2 end), -- put minimum user_id on top 
     name asc 
+1

'ORDER BY USER_ID DESC、USERNAME' ?? –

+0

この場合、USERNAMEの順序は一意ではないので、USER_IDはおそらく一意ではないので使用されません。 – NikNik

+0

@Jaydipj:最低のuser_idを持つ1行だけを必要とし、残りのユーザー名をユーザー名で注文します。 –

答えて

2

ある

select USER_ID, USERNAME, case when USER_ID=(select max(USER_ID) from your_table) 
           then 1 else 2 end as firstOrder 
from your_table 
order by firstOrder asc, USERNAME asc 

ので、あなたがします彼のfirstOrder1であるのでjohnが最初のレコードであり、次にUSERNAMEで注文します。

+0

私は既にそれ以前に列で複数の注文があってもうまくいきますか? (例:col1、col2、col3、col4の場合(行番号が......の場合) –

+1

@HingleMcJingleberry yes – MT0

+0

まずcol1、col2などで注文してからuser_id 'col1、col2'などの固定値ごとに最も低い' user_id'を望んでいるでしょう(そうでなければ質問は本当に意味をなさない)。もしそうなら** no **と書いたようには動作しないだろうあなたは解析句を 'over(col1、col2、... by order by user_id)'に変更する必要があります。 – mathguy

1

あなたはあなたの記録を注文するために使用することができ、第3列を追加することができます:

オラクルDBのバージョンは、あなたがorder byを使用することができ12C

関連する問題