Tôi đang ở trong một tình huống mà tôi muốn nhận được giá trị tối thiểu từ 6 cột.
Tôi đã tìm thấy ba cách cho đến nay để thực hiện điều này, nhưng tôi lo ngại về hiệu suất của các phương pháp này và muốn biết cách nào sẽ tốt hơn cho hiệu suất.
Phương pháp đầu tiên là sử dụng một tuyên bố trường hợp lớn . Đây là một ví dụ với 3 cột, dựa trên ví dụ trong liên kết ở trên. Báo cáo trường hợp của tôi sẽ dài hơn nhiều vì tôi sẽ xem xét 6 cột.
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
Tùy chọn thứ hai là sử dụng UNION
toán tử với nhiều câu lệnh chọn . Tôi sẽ đặt cái này trong UDF chấp nhận tham số Id.
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
và
select min(col)
from
(
select col1 [col] from MyTable where Id = @id
union all
select col2 from MyTable where Id = @id
union all
select col3 from MyTable where Id = @id
) as t
Và tùy chọn thứ 3 tôi tìm thấy là sử dụng toán tử UNPIVOT , cái mà tôi thậm chí không biết đã tồn tại cho đến tận bây giờ
with cte (ID, Col1, Col2, Col3)
as
(
select ID, Col1, Col2, Col3
from TestTable
)
select cte.ID, Col1, Col2, Col3, TheMin from cte
join
(
select
ID, min(Amount) as TheMin
from
cte
UNPIVOT (Amount for AmountCol in (Col1, Col2, Col3)) as unpvt
group by ID
) as minValues
on cte.ID = minValues.ID
Do kích thước bảng và tần suất mà bảng này được truy vấn và cập nhật, tôi lo ngại về tác động hiệu suất mà các truy vấn này sẽ có trên cơ sở dữ liệu.
Truy vấn này thực sự sẽ được sử dụng trong một liên kết với một bảng có vài triệu bản ghi, tuy nhiên các bản ghi được trả về sẽ bị giảm xuống còn khoảng một trăm bản ghi cùng một lúc. Nó sẽ được chạy nhiều lần trong ngày và 6 cột tôi đang truy vấn thường xuyên được cập nhật (chúng chứa các số liệu thống kê hàng ngày). Tôi không nghĩ có bất kỳ chỉ mục nào trên 6 cột tôi đang truy vấn.
Phương pháp nào trong số các phương pháp này tốt hơn cho hiệu suất khi cố gắng lấy tối thiểu nhiều cột? Hoặc có một phương pháp nào khác tốt hơn mà tôi không biết?
Tôi đang sử dụng SQL Server 2005
Dữ liệu mẫu & Kết quả
Nếu dữ liệu của tôi chứa các bản ghi như thế này:
Id Col1 Col2 Col3 Col4 Col5 Col6 1 3 4 0 2 1 5 2 2 6 10 5 7 9 3 1 1 2 3 4 5 4 9 5 4 6 8 9
Kết quả cuối cùng phải là
Giá trị Id 1 0 2 2 3 1 4 4
Year1
kết quả, điều này có thể không nhất thiết đúng.