Я нахожусь в ситуации, когда я хочу получить минимальное значение из 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
Образцы данных и результаты
Если мои данные содержали такие записи:
Идентификатор 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
Конечный результат должен быть
Значение идентификатора 1 0 2 2 3 1 4 4
Year1
в качестве результата, что не всегда может быть правильным.