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
, rnDesc
và rnAsc
). 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
.
Nguồn
2013-05-14 13:25:57
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
Tôi sử dụng SQL Server – user1861065