2013-05-14 23 views
5

Tôi có một câu hỏi, làm cách nào để có giá trị cao nhất, sau đó là giá trị thấp nhất giá trị cao thứ hai từ một bảng.Cách lấy Giá trị cao nhất, sau đó là thấp nhất, sau đó là số 2 lớn nhất, và sau đó là giá trị thấp thứ 2 và tiếp tục từ bảng

Ví dụ: trong bảng

Name  Value 
---------------------- 
Apple  2 
Pear   3 
Pineapple 6 
Mango  7 
Kiwi   1 

Kết quả sẽ giống như thế này:

Name   Value 
----------------------- 
Mango   7 
Kiwi   1 
Pineapple  6 
Apple   2 
Pear   3 

Cảm ơn!

+1

Câu hỏi hay! Lời xin lỗi của tôi cho sự hiện diện của cử tri gần gũi. Bạn đang dùng gói dữ liệu nào vậy? (SQL Server, MySQL, PostgreSQL, Oracle, ...) – Andomar

+0

Tôi sử dụng SQL Server – user1861065

Trả lời

10

tôi giả thẻ tsqlt có nghĩa là phải tsql, và thêm rằng điều này hàm ý rằng đây là cho SQL server:

;with Numbered as (
    select Name,Value, 
     ROW_NUMBER() OVER (ORDER BY Value DESC) as rnDesc, 
     ROW_NUMBER() OVER (ORDER BY Value ASC) as rnAsc 
    from 
     @t 
), MixedNumbered as (
    select 
     Name,Value, 
     CASE WHEN rnDesc < rnAsc THEN rnDesc ELSE rnAsc END as rnFin, 
     rnAsc, 
     rnDesc 
    from 
     Numbered 
) 
select Name,Value from MixedNumbered order by rnFin,rnDesc 

này hoạt động bằng cách tìm các số liên tiếp trong khi xem xét danh sách được sắp xếp cả hai cao nhất -đến thấp nhất và thấp nhất đến cao nhất (trong số Numbered, rnDescrnAsc). Sau đó, chúng tôi lấy số hàng thấp nhất đạt được khi xem xét một trong các đơn đặt hàng này (MixedNumbered, rnFin).

Điều này sẽ sau đó, tạo hai hàng với một rnFin bằng 1, hai hàng với nó bằng 2, v.v. ghép nối các dòng cao nhất thứn và n thứ thấp nhất cho đến khi chúng tôi đạt đến giữa tập hợp. Sau đó, chúng tôi sử dụng điều này để sắp xếp tập kết quả cuối cùng - nhưng sử dụng vị trí thu được bằng cách xem xét các giá trị được sắp xếp từ cao nhất đến thấp nhất (rnDesc) làm bộ ngắt kết nối giữa mỗi cặp với cùng giá trị rnFin. Điều này có nghĩa, đối với mỗi cặp, hàng có giá trị cao hơn sẽ xuất hiện đầu tiên.

Để đảo ngược kết quả (thấp nhất trước tiên, sau đó cao nhất, thấp thứ hai, thứ hai cao nhất, v.v.), chúng tôi chỉ cần thay đổi mệnh đề ORDER BY cuối cùng thành rnFin,rnAsc.

+0

Tuyệt vời! Điều này làm việc tốt cho tôi ... Cảm ơn bạn !!! – user1861065

4

Điều này gán số 2 cho hàng lớn nhất, 3 đến nhỏ nhất, 4 đến lớn nhất thứ hai, v.v.

select * 
from (
     select 1 + 2 * row_number() over (order by Value asc) as rnAsc 
     ,  2 * row_number() over (order by Value desc) as rnDesc 
     ,  t1.* 
     from Table1 t1 
     ) SubQueryAlias 
order by 
     case 
     when rnDesc < rnAsc then rnDesc 
     else rnAsc 
     end 

Example at SQL Fiddle.

0

Một câu hỏi rất hay! Vui lòng kiểm tra thử của tôi:

SELECT Name,Value 
FROM(
    SELECT *, MAX(Rnum) OVER() mx, MAX(Rnum) OVER()/2.0 hf FROM(
     SELECT *, ROW_NUMBER() OVER(ORDER BY value DESC) Rnum From @tbl 
    )x 
)xx 
ORDER BY CASE WHEN Rnum-hf<=0 THEN Rnum ELSE mx-Rnum+1 END, Rnum 
Các vấn đề liên quan