2013-05-09 21 views
6

結果を1つの列(NAME)でグループ化し、次に各グループの2番目の列(注)で並べ替え、最後にグループの中で最も高い順に並べます。私のエンティティがこれらのようにスクランブルされている場合グループの最大値で並べ替え

ので、:アンドリューは彼の最高音ので、最初の登場で、名前でグループ化された

NAME   NOTE 
Andrew  19 
Andrew  18 
Andrew  17 
Thomas  18 
Thomas  14 
Thomas  12 
Frank  16 
Frank  15 
Frank  5 

NAME   NOTE 
Andrew  19 
Thomas  18 
Andrew  18 
Andrew  17 
Frank  16 
Frank  15 
Thomas  14 
Thomas  12 
Frank  5 

私はこのように注文するためにそれらをしたいと思います19歳、トーマス(18歳)、フランク(16歳)です。ここで

よろしく、

ヴァル

答えて

3

ウィンドウ関数を使用して、それを行うための方法です:

select name, note 
from (select t.*, max(note) over (partition by name) as maxnote 
     from t 
    ) t 
order by maxnote desc, name 

maxnoteで注文に加えて、名前でも受注。ネクタイがある場合は、指定された名前のすべてのレコードをまとめて保持します。

+0

1あなたはby'ため 'のafer別名を参照しないので、サブクエリは必要ことができます – Andomar

+0

@Andomar。 。 。そのように書かれていれば、 'maxnote'が出力になければなりません。 –

+0

@GordonLinoffニース、順序のmaxnoteはそれの後ろに 'desc'を持つべきですが、良い解決策です。 –

3

CTEの答えは...

Create Table NameNoteTable (Name Varchar(10), Note Int); 

Insert NameNoteTable 
Select 'Andrew', 19 
Union All 
Select 'Andrew', 18 
Union All 
Select 'Andrew', 17 
Union All 
Select 'Thomas', 18 
Union All 
Select 'Thomas', 14 
Union All 
Select 'Thomas', 12 
Union All 
Select 'Frank', 16 
Union All 
Select 'Frank', 15; 

With cte As 
(
     Select Row_Number() Over (Order By Max(Note) Desc) As tID, 
       Name, 
       Max(Note) As MaxNote 
     From NameNoteTable 
     Group By Name 
) 
Select nnt.Name, nnt.Note 
From NameNoteTable nnt 
Join cte c 
     On nnt.Name = c.Name 
Order By tID, Note Desc; 
1
SELECT t.name, t.note 
FROM @tbl t 
ORDER BY (SELECT MAX(note) FROM @tbl WHERE name = t.name) DESC 
     , name 
     , note DESC 

これが最も簡単な方法ですが、PARTITIONのBYを使用すると、わずかにより構文で、大きなテーブルの上の可能性がより効率的に実行します。

0

非常に単純な方法:

選択名、名前のASCによってNameNoteTable 順から、ノート、ノートDESC

+1

このクエリは 'name'カラムをアルファベット順に並べ替えます。この質問では、 'name'カラムは、ユーザごとの' note'の降順に基づいて順序付けされるべきです – KartikKannapur

関連する問題