Chìa khóa để thao tác bảng xếp hạng là sử dụng liên minh. Đối với mỗi cột, bạn sử dụng một câu lệnh chọn riêng. Trong tuyên bố đó, thêm một số nhận dạng cho thấy từ đó mỗi cột được kéo sau đó. Chèn kết quả vào một biến bảng, sau đó bạn có thể thao tác xếp hạng bằng cách sắp xếp trên số nhận dạng hoặc nhân thứ hạng theo một số giá trị dựa trên số nhận dạng.
Điều quan trọng là cung cấp cho sự xuất hiện của việc sửa đổi thứ hạng, không thực sự thay đổi xếp hạng của máy chủ sql.
Ví dụ sử dụng một biến bảng:
DECLARE @Results TABLE (PersonId Int, Rank Int, Source Int)
Đối với bảng Người Cột PersonId Int PK Identity, FirstName VarChar(100), MiddleName VarChar(100), LastName VarChar(100), AlsoKnown VarChar(100)
với mỗi cột thêm vào một danh mục văn bản đầy đủ, bạn có thể sử dụng các truy vấn:
INSERT INTO @Results (PersonId, Rank, Source)
SELECT PersonId, Rank, 1
FROM ContainsTable(People, FirstName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
UNION
SELECT PersonId, Rank, 2
FROM ContainsTable(People, MiddleName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
UNION
SELECT PersonId, Rank, 3
FROM ContainsTable(People, LastName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
UNION
SELECT PersonId, Rank, 4
FROM ContainsTable(People, AlsoKnown, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
/*
Now that the results from above are in the @Results table, you can manipulate the
rankings in one of several ways, the simplest is to pull the results ordered first by Source then by Rank. Of course you would probably join to the People table to pull the name fields.
*/
SELECT PersonId
FROM @Results
ORDER BY Source, Rank DESC
/*
A more complex manipulation would use a statement to multiply the ranking by a value above 1 (to increase rank) or less than 1 (to lower rank), then return results based on the new rank. This provides more fine tuning, since I could make first name 10% higher and middle name 15% lower and leave last name and also known the original value.
*/
SELECT PersonId, CASE Source WHEN 1 THEN Rank * 1.1 WHEN 2 THEN Rank * .9 ELSE Rank END AS NewRank FROM @Results
ORDER BY NewRank DESC
Một nhược điểm là bạn sẽ nhận thấy tôi đã không sử dụng UNION ALL
, vì vậy nếu một từ xuất hiện trong nhiều cột, thứ hạng sẽ không phản ánh điều đó. Nếu đó là một vấn đề bạn có thể sử dụng UNION ALL
và sau đó loại bỏ id người trùng lặp bằng cách thêm tất cả hoặc một phần của thứ hạng bản ghi trùng lặp vào thứ hạng của một bản ghi khác với cùng một id người.
Điều này cực kỳ hữu ích! Đó là một sự xấu hổ rằng điều này không được xây dựng trong SQL Server rồi. –
tuy nhiên điều này không tóm tắt thứ hạng .... – yeeen