Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để lấy mức lương cao thứ n từ một bảng mà không cần sử dụng TOP và truy vấn phụ?

Thử một CTE - Biểu thức Bảng Phổ biến:

WITH Salaries AS
(
    SELECT 
       SalaryAmount, ROW_NUMBER() OVER(ORDER BY SalaryAmount DESC) AS 'RowNum'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   RowNum <= 5

Điều này nhận được 5 mức lương cao nhất theo thứ tự giảm dần - bạn có thể chơi với RowNumn giá trị và về cơ bản truy xuất bất kỳ phần nào từ danh sách tiền lương.

các chức năng xếp hạng khác có sẵn trong SQL Server cũng có thể được sử dụng - ví dụ:có NTILE điều này sẽ chia kết quả của bạn thành n nhóm có kích thước bằng nhau (càng chặt chẽ càng tốt), vì vậy bạn có thể ví dụ:tạo 10 nhóm như thế này:

WITH Salaries AS
(
    SELECT 
       SalaryAmount, NTILE(10) OVER(ORDER BY SalaryAmount DESC) AS 'NTile'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   NTile = 1

Điều này sẽ chia tiền lương của bạn thành 10 nhóm có quy mô bằng nhau - và nhóm có NTile=1 là nhóm "10% lương cao nhất".



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trả về hằng số BIT từ Thủ tục được lưu trữ trong SQL

  2. Cách Bỏ Ràng buộc Khoá Ngoại trong Cơ sở dữ liệu SQL Server - Hướng dẫn SQL Server / TSQL Phần 75

  3. Không thể bắt đầu một giao dịch phân tán

  4. sp_executesql chậm với các tham số

  5. MultipleActiveResultSets =Đúng hay nhiều kết nối?