2016-04-04 3 views
0

を注文ません:クエリは私が結果を生成するために書いていない次のクエリ持って適切に

select distinct "ID","Name" 
    from (
select myview.ID as "ID", myview.Name as "Name", 
    rank() over (partition by myview.ID order by myview.OTHER_ID DESC, rownum) rnk 
from my_view myview 
)where rnk = 1 
ORDER BY "Name" DESC; 

を私は、文字列であるname属性で注文する必要がありますが、それもIかかわらず、注文されていません名前で注文する。どうすれば名前で注文できますか?

のでname列のデータは、それがこの順序でデータを返します。(それはorder byに影響を与えるべきではないが)

368838, "AUSER03232, JOHN" 
368532, "BUSER000417, JANE" 
    20252, "BUSER108276, JANE" 
    75235, "AUSER01809, JANE" 
+3

これは妥当と思われるので、あなたが今取得した出力、およびあなたが見ることが期待される出力。列のデータ型とNLS_SORTおよびNLS_COMPの設定は、ソートの適用時期を誤解しているだけではない場合にも役立ちます。ランク句で何をしているのですか?それは何をやろうとしていますか? –

+0

更新された質問。 – user2924127

+2

これらは正しく注文されています。昇順はA-Z、降順はZ-Aです。 'JOHN'は' JANE'降順の前に来ます。 –

答えて

0

distinctは必要ありません。 rank()にはrownumが含まれているため、各行が一意になります。したがって、だけではなく、row_number()を使用してdistinctを取り除く:

select "ID", "Name" 
from (select myview.ID as "ID", myview.Name as "Name", 
      row_number() over (partition by myview.ID order by myview.OTHER_ID DESC) as seqnum 
     from my_view myview 
    ) v 
where seqnum = 1 
order by "Name" DESC; 

これは、重複除去のオーバーヘッドを節約できます。

order byで二重引用符ではなく一重引用符を使用した場合、order by "Name"order by 'Name'とはまったく異なります。

+0

rownumは、パーティションではなく、順番になっているので、それはもはや一意になりません。重複したID、OTHER_IDのペアがあった場合にのみ影響を与えます。それでも、その効果は最高で非決定的になるでしょう... –

+0

@AlexPoole。 。 。 'order by'の重複を防ぐことになると確信しています。つまり' rank() 'が重複した値を返すことはないということです。 –

0

出力データとそのクエリが一致しません。

"出力"データを使用して、それをクエリに戻し、結果を全く異なる出力にします。あなたが作っているものがあります。

お願いします。完全な作業例を最初から最後まで投稿してください。テーブル作成を含めるか、データを入力してください...あなた自身で実行してください。実際の結果を表示してください。コピー/それを手動でマッサージして「問題のように見える」ようにしないでください。それがない場合、それは良い例ではありません、あなたの「問題」を再作成します。

with w_data as (
     select 368838 ID, 'AUSER03232, JOHN' Name from dual union all 
     select 368532 ID, 'BUSER000417, JANE' Name from dual union all 
     select 20252 ID, 'BUSER108276, JANE' Name from dual union all 
     select 75235 ID, 'AUSER01809, JANE' Name from dual 
     ) 
    select distinct ID, Name 
    from (
     select myview.ID as ID, myview.Name as Name, 
      rank() over (partition by myview.ID order by myview.ID DESC, rownum) rnk 
     from w_data myview 
     ) 
    where rnk = 1 
    ORDER BY Name DESC; 

      ID NAME 
    ---------- ----------------- 
     20252 BUSER108276, JANE 
     368532 BUSER000417, JANE 
     368838 AUSER03232, JOHN 
     75235 AUSER01809, JANE 

    SQL> 

注私は、誰でも簡単に、/ペーストをコピーして、そのサーバー上で実行可能なクエリを提供しています)、繰り返す。彼らは私が持っているのと同じ結果を生み出すかどうかを簡単に確認して、何か違うものがあればそれを簡単に伝えることができます;)

関連する問題