6

結果を 1 つの列 (NAME) でグループ化し、次にグループごとに 2 番目の列 (NOTE) で並べ替え、最後にグループを最大の NOTE で並べ替えたいと思います。

したがって、私のエンティティが次のようにスクランブルされている場合:

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

私はそれらを次のように注文したいと思います:

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

アンドリューの最高音が 19 であるため最初に表示され、次にトーマス (18) とフランク (16) が表示されます。

よろしく、

ヴァル

4

4 に答える 4

4

ウィンドウ関数を使用してそれを行う方法は次のとおりです。

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

maxnote による順序付けに加えて、名前による順序付けも行います。同数の場合は、特定の名前のすべてのレコードをまとめて保持します。

于 2013-05-09T15:56:30.973 に答える
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;
于 2013-05-09T16:02:18.967 に答える
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 を使用すると、構文が少し増えるだけで、大きなテーブルではより効率的に実行される可能性があります。

于 2013-05-09T16:40:44.900 に答える
0

非常に簡単な方法:

名前を選択し、NameNoteTable からメモを付けます

于 2016-08-02T11:15:42.013 に答える