Я в ситуації, коли хочу отримати мінімальне значення з 6 стовпців.
Поки що я знайшов три способи досягти цього, але я маю занепокоєння щодо ефективності цих методів, і хотів би знати, що було б краще для ефективності.
Перший метод полягає у використанні великого викладу регістру . Ось приклад з 3 стовпцями, спираючись на приклад у посиланні вище. Мій виклад справи буде набагато довшим, оскільки я перегляну 6 колонок.
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
Другий варіант - використання UNION
оператора з декількома операторами вибору . Я ставлю це до UDF, який приймає параметр Id.
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
і
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
І третім варіантом, який я знайшов, було використання оператора UNPIVOT , про який я навіть не знав, що існував дотепер
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
Через розмір таблиці та частоту запитів та оновлення цієї таблиці, я стурбований впливом на ефективність цих запитів на базу даних.
Цей запит буде фактично використаний при приєднанні до таблиці з кількома мільйонами записів, однак повернені записи будуть зменшені приблизно до ста записів за один раз. Він буде працювати багато разів протягом дня, і 6 стовпців, які я запитую, часто оновлюються (містять щоденну статистику). Я не думаю, що в 6 стовпцях, які я запитую, немає індексів.
Який із цих методів кращий для продуктивності, намагаючись отримати мінімум кількох стовпців? Або є ще один кращий метод, про який я не знаю?
Я використовую SQL Server 2005
Зразки даних та результати
Якщо мої дані містили такі записи:
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
Кінцевий результат повинен бути
Значення Id 1 0 2 2 3 1 4 4
Year1
як результат, що може не обов’язково бути правильним.