2013-05-09 59 views
6

Tôi muốn nhóm kết quả của mình theo một cột (NAME), sau đó đặt hàng theo cột thứ hai (CHÚ THÍCH) cho mỗi nhóm và cuối cùng sắp xếp các nhóm theo CHÚ THÍCH cao nhất.Sắp xếp theo giá trị lớn nhất trong nhóm

Vì vậy, nếu các đơn vị của tôi đang tranh giành như thế này:

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

tôi muốn họ được ra lệnh như thế này:

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

nhóm theo tên, với Andrew xuất hiện đầu tiên bởi vì nốt cao nhất của mình 19 tuổi, rồi Thomas (18 tuổi) và Frank (16 tuổi).

Kính trọng,

Val

Trả lời

3

Dưới đây là một cách để làm điều đó bằng chức năng cửa sổ:

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

Ngoài đặt hàng bởi các maxnote, nó cũng đơn đặt hàng bằng tên. Nếu có quan hệ, thì nó giữ tất cả các bản ghi cho một tên đã cho với nhau.

+0

1 Bạn có thể tham khảo một bí danh afer 'trật tự by', vì vậy không cần thiết phải subquery – Andomar

+0

@Andomar. . . Nếu nó được viết theo cách đó, thì 'maxnote' sẽ phải ở đầu ra. –

+0

@GordonLinoff Nice, maxnote theo thứ tự bởi nên có 'desc' sau nó, nhưng giải pháp tốt đẹp. –

3

CTE câu trả lời ...

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 

Đây là cách đơn giản nhất, sử dụng phân vùng bằng cách là cú pháp chỉ hơi hơn và trên bảng lớn có khả năng sẽ chạy hiệu quả hơn.

0

cách Rất đơn giản:

chọn tên, lưu ý từ NameNoteTable trật tự theo tên asc, lưu ý desc

+1

Truy vấn này yêu cầu cột 'tên' theo thứ tự bảng chữ cái. Trong câu hỏi, cột 'name' phải được sắp xếp dựa trên thứ tự giảm dần của' note' cho mỗi người dùng – KartikKannapur

Các vấn đề liên quan